Java 8 泛型 - 生成包含 <? 的列表 (jdk 8)使用方法扩展 MyObject>

标签 java generics java-8

我会尝试简化我的编译问题。
我有一个汽车对象和两个后继者,称为本田和丰田。
我有另一个名为 CarContainer 的对象,其定义如下:

public class CarContainer<T> {} // doesn't do anyhthing

我想创建多种类型汽车对象的汽车容器列表。
在此示例中,它将保存一系列该类型的汽车。

List<CarContainer<? extends Car[]>> obs = new ArrayList<>();

这工作正常 -

CarContainer<Honda[]> hondaCarContainer = new CarContainer<>();
CarContainer<Toyota[]> toyotaCarContainer = new CarContainer<>();
Collections.addAll(obs, hondaCarContainer, toyotaCarContainer);

但是当我尝试使用方法生成容器时

private static <T> CarContainer<T[]> getCarContainer(T car) {
    return null;
}

并调用

Collections.addAll( obs, 
                    getCarContainer(new Honda()), 
                    getCarContainer(new Toyota()));

我的代码无法编译。

(尽管这确实

Collections.addAll(obs, getCarContainer(new Honda()));

令人难以置信的是,这也是

    CarContainer<Honda[]> carContainer = getCarContainer(new Honda());
    Collections.addAll(obs, carContainer, getCarContainer(new Toyota()));

这是一样的。 )

如何解决?

最佳答案

我可以毫无问题地编译和运行你的代码,(win7 jdk7):

public class MyTest {

public static void main(String[] args) {
    new MyTest();
}

public MyTest() {
    List<CarContainer<? extends Car[]>> obs = new ArrayList<>();

    Collections.addAll( obs,
            getCarContainer(new Honda()),
            getCarContainer(new Toyota()));

    System.out.println(obs.size());
}

private <T> CarContainer<T[]> getCarContainer(T car) {
    return null;
}

class Car{}

class Honda extends Car {}

class Toyota extends Car {}

class CarContainer<T> {}
}

它在控制台中输出“2”。

关于Java 8 泛型 - 生成包含 <? 的列表 (jdk 8)使用方法扩展 MyObject>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28276904/

相关文章:

Java JDK 8 IndexedPropertyDescriptor 自 JDK 7 以来已更改为 List 对象

lambda - optional <List> Java 8 lambda 表达式获取第一个元素

Java 8 流 - 通过比较两个列表进行过滤

java - Sonarqube 的 UndocumentedApi 变得毫无用处?

java - 在 res 文件夹下找不到文件夹和变量

c# - 如何使用类型参数从泛型类型中提取原始泛型类型

c++ - 在类外将部分指定的模板化矩阵乘法运算符重载函数声明为友元

java -classpath ./sqljdbc4.jar myclassname

java - MVC 模式 : which is better? 为 View 或 Controller 创建和引用其他?

c# - 通过反射实例化泛型