我在初始化名为list的属性时遇到了问题,这是一个ArrayList
public class SensorList<T extends Sensor> {
ArrayList<T> list;
public SensorList() {
list = new ArrayList<T>();
}
public SensorList(List<T> t) {
list = this.list
}
public void add(T t) {
list.add(t);
}
public void remove(T t) {
list.remove(t);
}
每次我执行此步骤时都会给出一个错误,指出ArrayList无法转换为List所以我该如何解决这个问题呢?
答案 0 :(得分:1)
所有List
实现List
接口,但并非所有ArrayList
实现都是ArrayList
。因此,您可以将List
实例分配给ArrayList<T> list;
变量,但反之亦然。
要么改变
List<T> list;
到
public SensorList(List<T> t)
或更改
public SensorList(ArrayList<T> t)
到
List
第三种选择是将传递的ArrayList
转换为public SensorList(List<T> t) {
this.list = new ArrayList<T>(t);
}
:
List
前者通常是首选选项,因为它允许您的班级使用任何list = this.list
实施。
P.S。
我假设
this.list = t;
是一个错字,你的意思是
{{1}}
答案 1 :(得分:0)
您可以将ArrayList<T>
分配给List<T>
,但无法将List<T>
分配给ArrayList<T>
(想一想,它实际上可能是List<T>
的另一种类型,例如LinkedList<T>
)。
使用您可以使用的不太具体的类型通常是个好主意。在您的情况下,如果list
的类型为List<T>
,则代码就足够了。
答案 2 :(得分:0)
处理此问题的正确方式:
List<T>
,而不是ArrayList this(new ArrayList<>());
重点是:在创建新列表时,您确实只想要使用特定于实现的类型ArrayList。所有其他时间,更喜欢只使用接口类型列表。
除此之外:列表是一个坏名字。它没有说明该变量的用途。你可以简单地称它为sensors
,例如表达A)复数B)这个列表将要处理的事情。
答案 3 :(得分:0)
您应该将构造函数更改为此。您不想设置列表参数,而是您的列表字段。所以你应该改变它:
public SensorList(List<T> t) {
this.list = (ArrayList)t;
}
或将其更改为:
public SensorList(ArrayList<T> list){
this.list = list;
}
答案 4 :(得分:0)
您对LIST
的声明错误。始终拥有Generic Declaration
,然后分配它的实施。
List<T> list;
public SensorList() {
list = new ArrayList<T>();
}
public SensorList(List<T> t) {
list = this.list
}
public void add(T t) {
list.add(t);
}
public void remove(T t) {
list.remove(t);
}`