【发布时间】:2012-09-10 07:05:08
【问题描述】:
假设我有一个这样的界面
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
}
(可能发生这种情况的一个例子是在FooImpl 中实现Foo 和Bar 将两个接口声明的方法转发到一个可变参数方法)
现在,假设在同一个包中的某处有一个静态方法,它返回 FooImpl 和 Foo。有人会认为你可以使用return new FooImpl<Ret, Arg1, ?>(...),而实际上你不能(你必须使用具体的虚拟类型Arg2,即return new FooImpl<Ret, Arg1, Object>(...),比如说)。
知道为什么会这样,尤其是Foo 接口和包可见性有效地将FooImpl 隐藏在使用静态方法的任何内容中吗?是不是因为人们仍然可以在一定程度上使用反射来到达需要具体类型的FooImpl 的Bar 部分?
【问题讨论】:
-
您收到的错误信息是什么?您是为构造函数获取它还是在尝试将其强制转换为返回时?该静态方法的返回签名是什么?
标签: java generics interface wildcard