これはJavaで可能です。
package x;
public class X {
// How can this method be public??
public Y getY() {
return new Y();
}
}
class Y {}
getY()
では、Javaコンパイラがメソッドを次のように宣言できる理由は何public
ですか?私を悩ませているのは、クラスY
はパッケージプライベートですが、アクセサーgetY()
はメソッドシグネチャでそれを宣言しているということです。しかし、パッケージの外では、メソッドの結果を以下x
に割り当てることしかできません。Object
// OK
Object o = new X().getY();
// Not OK:
Y y = new X().getY();
わかった。これで、どういうわけか、これがメソッド結果の共分散で説明できる例を作成することができます。しかし、事態をさらに悪化させるために、私はこれを行うこともできます:
package x;
public class X {
public Y getY(Y result) {
return result;
}
}
class Y {}
今ではパッケージgetY(Y result)
の外から電話をかけることはできませんでした。x
なぜ私はそれをすることができますか?コンパイラがメソッドを呼び出せない方法で宣言できるのはなぜですか?