我有点困惑。
我有一个类,它不是集合,但它确实引用了通用对象:
public class XClass<E extends AnInterface>{
E instanceobject;
public void add(E toAdd){}
}
public interface AnInterface{}
public class A implements AnInterface{}
public class B implements AnInterface{}
我相信我在某处读到 <? extends AnInterface>
如果您想同时在通用对象中使用多个子类型类型,则使用(在声明 XClass 的实例时),而 <T extends AnInterface>
是否只允许您一次在泛型类中拥有一种子类型?
但是,我只能使用:
XClass<AnInterface> xc = new XClass<AnInterface>();
A a = new A();
B b = new B();
xc.add(a);
xc.add(b);
这样我就可以将 Supertype 的多个子类型传递给泛型类......
我不明白使用“?”的目的使用接口(interface)作为通用参数有什么问题吗?
最佳答案
可以添加两种类型的对象的原因A
和 B
这是因为您使用接口(interface)对 XClass 进行了参数化,因此添加两个实现该接口(interface)的不同类并没有错。
另一方面,如果您将 XClass 定义为:
XClass<A> xc = new XClass<A>();
然后表达式 xc.add(b);
会产生编译错误,因为所有添加的对象必须具有与声明相同的类型,在本例中为 A。
如果你声明你xc
例如:
XClass<? extends AnInterface> xc = new XClass<AnInterface>();
那么添加a
就不再合法了或 b
, 因为我们唯一知道的是 xc 是 AnInterface
的一些未知但固定子类型,并且无法知道该未知类型是否为 A
或 B
或其他任何内容。
但假设您正在编写一个方法来接受 XClass 类型,您可以迭代之前添加的元素。您唯一的限制(为了示例)是项目扩展 AnInterface
,您不关心实际类型是什么。
您可以像这样声明此方法:
public static void dummyMethod(XClass<? extends AnInterface> dummy){
//do stuff here, all the elements extend (implement in this case), AnInterface, go wild.
}
现在您可以向此方法传递任何类似 XClass<A>
的内容, XClass<B>
或 XClass<AnInterface>
, 这一切都将是有效的。
请记住,出于与上述相同的原因,您不能向传递的对象添加内容。我们不知道未知类型是什么!
public static void dummyMethod(XClass<? extends AnInterface> dummy){
//do stuff here, all the elements extend (implement in this case), AnInterface, go wild.
dummy.add(new A()); //you can't do this, we have no idea what type ? stand for in this case
}
关于java - <T extends AnInterface> 与 <?扩展接口(interface)>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11955515/