一尘不染

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

java

我已经对这个问题打了一段时间,以为也许有一些新鲜的眼睛会看到这个问题。谢谢你的时间。

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>());
  }
}

使用Java8。在我看来,直接在中创建容器test等效于中的容器test2,但编译器会说:

Test.java:15: error: no suitable method found for add(Tbin<Derived>)
    test2.add(new Tbin<Derived>());
         ^

我该怎么写TbinTbinList所以最后一行是可以接受的?

注意,实际上我将添加typed Tbin,这就是为什么我Tbin<Derived>在最后一行中指定了原因。


阅读 216

收藏
2020-12-03

共1个答案

一尘不染

好的,这是答案:

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泛型看起来很简单。

谢谢大家,成为共鸣。

2020-12-03