java - <T extends AnInterface> 与 <?扩展接口(interface)>

标签 java generics

我有点困惑。

我有一个类,它不是集合,但它确实引用了通用对象:

    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)作为通用参数有什么问题吗?

最佳答案

可以添加两种类型的对象的原因AB这是因为您使用接口(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 的一些未知但固定子类型,并且无法知道该未知类型是否为 AB或其他任何内容。

但假设您正在编写一个方法来接受 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/

相关文章:

c# - 在不指定 T 的情况下模拟 Moq 中的泛型方法

java - fork /加入 : optimal threads count

java - SQL 查询的准备语句,错误 DB2 SQL 错误 : SQLCODE=-206, SQLSTATE=42703

java - 如何在 JNI 中将 int 转换为 String(?)?

java - 使用 Java 泛型确保类型安全

Java DAO 工厂动态返回的对象类型

java - 使用参数化对象数组调用函数

java - 如何在 Java 中替换文本文件中特定索引处的字符串

java - 有没有办法让 tika 在找到匹配项后停止解析文件?

swift - 如何在 Swift 中使用类型删除静态访问泛型子类型?