假设我有一个这样的界面
public interface Foo<Ret, Arg> {
public Ret doSomething(Arg arg);
}
以及一个仅具有包可见性的具体实现类。
class FooImpl<Ret, Arg1, Arg2> implements Foo<Ret, Arg>, Bar<Ret, Arg1, Arg2> {
// This class also implements something else making use of Arg2, so you cannot safely remove it
// But nothing relating to Arg2 is needed to create a FooImpl
}
(如何发生这种情况的一个例子是两个接口声明的方法的实现和Foo转发到一个可变参数方法)BarFooImpl
现在,假设在同一个包中的某处有一个静态方法返回 aFooImpl作为 a Foo。有人会认为您可以使用return new FooImpl<Ret, Arg1, ?>(...),而实际上您不能(您必须使用具体的虚拟类型作为Arg2,即return new FooImpl<Ret, Arg1, Object>(...),比如说)。
知道为什么会这样,尤其是Foo界面和包可见性有效地隐藏了FooImpl使用静态方法的任何内容吗?是因为人们仍然可以在某种程度上使用反射来到达需要具体类型的Bar部分吗?FooImpl