我最近开始学习Java,并且对泛型的使用有疑问。我使用参数和参数上限NumberBox<T extends Number>
类,该类仅存储Number
对象并进行比较。每当我尝试创建未知列表List<NumberBox<?>>
来存储任何NumberBox<T extends Number>
对象时,都无法使用非参数方法List<NumberBox<Short>>
将static addList(List<NumberBox<?>> destinationList, List<NumberBox<?>> sourceList)
添加到此未知列表中。但是,我可以使用参数方法<T extends Number> static addListInference(List<NumberBox<?>> destinationList, List<NumberBox<T>> sourceList)
将此参数列表添加到未知列表中。任何帮助表示赞赏。谢谢。
import java.util.*;
import java.lang.*;
import java.io.*;
interface Box<T> {
public T get();
public void set(T t);
public int compareTo(Box<T> other);
}
class NumberBox<T extends Number> implements Box<T> {
T t;
public NumberBox(T t) {
set(t);
}
@Override
public T get() {
return t;
}
@Override
public void set(T t) {
this.t = t;
}
@Override
public int compareTo(Box<T> other) {
int result = 0;
if (t.doubleValue() < other.get().doubleValue()) {
result = -1;
} else if (t.doubleValue() > other.get().doubleValue()) {
result = 1;
} else if (t.doubleValue() == other.get().doubleValue()) {
result = 0;
}
return result;
}
}
class MainClass {
public static <T extends Number>
void addListInference(List<NumberBox<?>> destinationList, List<NumberBox<T>> sourceList) {
destinationList.addAll(sourceList);
}
public static void addList(List<NumberBox<?>> destinationList,
List<NumberBox<?>> sourceList) {
destinationList.addAll(sourceList);
}
public static void main (String[] args) throws java.lang.Exception {
// your code goes here
List<NumberBox<?>> list = new ArrayList<>();
List<NumberBox<Short>> shortList = new ArrayList<>();
shortList.add(new NumberBox<Short>((short) 1));
// this one fails
MainClass.addList(list, shortList);
// this one works
MainClass.addListInference(list, shortList);
}
}
最佳答案
问题是
List<NumberBox<?>>
不是...的超类
List<NumberBox<Short>>
因为
List<Superclass>
是List<Subclass>
的超类。您可以使用以下命令使它在没有类型变量
T
的情况下工作:List<? extends NumberBox<?>>
关于java - 无法将List <SomeClass <SomeClass >>的边界类型的子代添加到List <SomeClass <?>>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37377399/