我会尝试简化我的编译问题。
我有一个汽车对象和两个后继者,称为本田和丰田。
我有另一个名为 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/