这在Java中是可以实现的:
package x;
public class X {
// How can this method be public??
public Y getY() {
return new Y();
}
}
class Y {}
那么,Java编译器为什么允许我将getY()
方法声明为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 {}
现在我无法从x
包之外调用getY(Y result)
。为什么会这样?为什么编译器允许我以一种无法调用方法的方式声明一个方法?