我一直在学习Java中的泛型。虽然我理解有关类型推断,参数化类和方法的概念,但在实验时我遇到了一个奇怪的情况。
我已经实现了一个Box类,它可以用来保存T类的项目。我使用List作为这个抽象的内部数据结构。以下是我的代码:
public class Box<T> {
private List<T> items;
public Box(){
items = new ArrayList<>();
}
public <T> void addItemToBox(T t){
items.add(t);
}
}
我在items.add(t)上遇到编译时错误,说List中的add(T)不能应用于(T)。我无法弄清楚这个错误的原因。另外,我不明白为什么我不能将类型为T的项添加到由T参数化的列表中
答案 0 :(得分:11)
您已在方法<T>
上对通用类型变量addItemToBox
进行了本地重新声明,该方法会隐藏类Box<T>
上的那个。
<T>
List<T> items;
不一样
您当前的代码100%相当于:
public class Box<T> {
private List<T> items;
public Box(){
items = new ArrayList<>();
}
public <T2> void addItemToBox(T2 t){
items.add(t);
}
}
如果您这样看,应该清楚为什么您的代码无法编译。
解决方案:移除方法声明前面的<T>
public void addItemToBox(T t)