将ArrayList属性初始化为构造函数中的参数List <t>

时间:2017-05-09 07:14:11

标签: java arraylist

我在初始化名为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所以我该如何解决这个问题呢?

5 个答案:

答案 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);
}`