java中的通用列表初始化

时间:2015-04-20 16:44:05

标签: java list object generics arraylist

我对List的初始化有问题。项目的类在编译时是不可知的 - 它们可以是int,float,string或自定义类。

所以我尝试了这个:

public class Sensordevice {
    private List<?> valueList;

    public void setValueList(List<?> valueList) {
        this.valueList = valueList;
    }   

    public void addValue(Object value) {
        if(valueList == null){
            valueList = getList(value.getClass());
        }
        valueList.add(value);
    }

    private <T> List<T> getList(Class<T> requiredType) {
        return new ArrayList<T>();
    }
}

但是我在addValue Methode的valueList.add(value)中得到了这个错误:

  

类型List中的方法add(capture#4-of?)不适用于参数(Object)


更新

非常感谢您的回复。这个解决方案适用于我的。

public class Sensordevice<T> {
    private List<T> valueList;

    public void setValueList(List<T> valueList) {
        this.valueList = valueList;
    }   

    public void addValue(T value) {
        if(valueList == null){
            valueList = new ArrayList<T>();
        }
        valueList.add(value);
    }
}

5 个答案:

答案 0 :(得分:1)

因此,如果您不了解课程中使用的特定类型,请将您的课程设为通用:

public class Sensordevice<T> { 

    private List<T> valueList;

    public void setValueList(List<T> valueList) {
        this.valueList = valueList;
    }   

    public void addValue(T value) {
        if(valueList == null){
            valueList = getList(value.getClass());
        }
        valueList.add(value);
    }

    private List<T> getList() {
        return new ArrayList<T>();
    }
}

答案 1 :(得分:1)

这对我有用。通过&#34;工作&#34;我的意思是我没有得到任何错误。它似乎没有提供任何功能,因为没有任何方法可以从Sensordevice获取对象列表,因为getList只返回一个新的空列表,但是#&# 39;你给的代码。我认为错误的核心是addValueObject而不是T

public class Sensordevice {
    private List valueList;

    public <T> void setValueList(List<T> valueList) {
        this.valueList = valueList;
    }

    public <T> void addValue(T value) {
        if(valueList == null){
            valueList = getList(value.getClass());
        }
        valueList.add(value);
    }

    private <T> List<T> getList(Class<T> requiredType) {
        return new ArrayList<>();
    }
}

public static void main(String[] args) {
    Sensordevice sd = new Sensordevice();
    sd.addValue(new Object());
    sd.addValue(new Integer(3));
    sd.addValue("");
    sd.addValue(new Sensordevice());

    System.out.println(sd.getList(Sensordevice.class));
}

答案 2 :(得分:0)

如果你不知道List类型,你可以不加任何类型规范,只需加上:private List valueList;

答案 3 :(得分:0)

valueList更改为:private List valueList;和getList()

private <T> List<Object> getList(Class<T> requiredType) {
        return new ArrayList<Object>();
    }

这可以修复错误,看起来工作正常。 我用字符串,浮点数和整数来测试它。

答案 4 :(得分:0)

目前,我认为使用List<?>代替Object没有任何优势。 要在列表中添加内容,您需要List<? super Object>之类的内容,但此 List<Object>相同。所以你可以忘记通配符,并使用普通List<Object>。然而,这不是很安全:

import java.util.*;

public class SensorDevice {
    private List<Object> valueList;

    public void setValueList(List<?> valueList) {
        this.valueList = (List<Object>)valueList;
    }   

    public void addValue(Object value) {
        if(valueList == null){
            valueList = getList();
        }
        valueList.add(value);
    }

    private List<Object> getList() {
        return new ArrayList<Object>();
    }


    //** <REMOVE> 
    public static void main(String[] args) {
      List<Integer> ints = new LinkedList<Integer>();
      ints.add(5); ints.add(7); ints.add(9);
      SensorDevice device = new SensorDevice();
      device.setValueList(ints);
      device.addValue(17);

      // this works too, however...
      device.addValue("hello");
    }

    // </REMOVE> */
}