首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java Generics Puzzler,扩展类并使用通配符

Java Generics Puzzler,扩展类并使用通配符
EN

Stack Overflow用户
提问于 2015-05-22 05:48:23
回答 5查看 1.7K关注 0票数 51

我已经对这个问题绞尽脑汁了一段时间,我想也许会有一些新的人看到这个问题;谢谢你的时间。

代码语言:javascript
复制
import java.util.*;

class Tbin<T> extends ArrayList<T> {}
class TbinList<T> extends ArrayList<Tbin<T>> {}

class Base {}
class Derived extends Base {}

public class Test {
  public static void main(String[] args) {
    ArrayList<Tbin<? extends Base>> test = new ArrayList<>();
    test.add(new Tbin<Derived>());

    TbinList<? extends Base> test2 = new TbinList<>();
    test2.add(new Tbin<Derived>());
  }
}

在我看来,在test中直接创建容器等同于在test2中创建容器,但是编译器说:

代码语言:javascript
复制
Test.java:15: error: no suitable method found for add(Tbin<Derived>)
    test2.add(new Tbin<Derived>());
         ^

如何编写TbinTbinList以使最后一行是可接受的?

请注意,我实际上将添加类型化的Tbins,这就是为什么我在最后一行中指定了Tbin<Derived>

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-05-22 06:21:17

好的,答案是:

代码语言:javascript
复制
import java.util.*;

class Tbin<T> extends ArrayList<T> {}
class TbinList<T> extends ArrayList<Tbin<? extends T>> {}

class Base {}
class Derived extends Base {}

public class Test {
  public static void main(String[] args) {

    TbinList<Base> test3 = new TbinList<>();
    test3.add(new Tbin<Derived>());

  }
}

正如我所料,一旦我看到它,就会很明显。但要走到这一步要费很多周折。如果只看工作代码,Java泛型似乎很简单。

谢谢大家,感谢你们的参与。

票数 1
EN

Stack Overflow用户

发布于 2015-05-22 06:18:43

TbinList的定义替换为

代码语言:javascript
复制
class TbinList<T> extends ArrayList<Tbin<? extends T>> {}

并用来定义test2

代码语言:javascript
复制
TbinList<Base> test2 = new TbinList<>();

相反,它可以解决这个问题。

根据您的定义,您将得到一个ArrayList<Tbin<T>>,其中T是扩展Base的任何固定类。

票数 10
EN

Stack Overflow用户

发布于 2015-05-22 06:02:03

您正在使用有界通配符(TbinList<? extends Base>> ...)。此通配符将阻止您向列表中添加任何元素。如果你想了解更多信息,这里有文档中关于Wildcards的章节。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30384955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档