我最近开始学习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);
}
}
答案 0 :(得分:1)
问题在于
List<NumberBox<?>>
不是
的超类List<NumberBox<Short>>
因为List<Superclass>
是List<Subclass>
的超类。
您可以在没有类型变量T
的情况下使用:
List<? extends NumberBox<?>>