如何使用类型参数传递空列表?

时间:2015-11-10 12:31:40

标签: java list generics collections

class User{
    private int id;
    private String name;

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

class Service<T> {
    private List<T> data;
    public void setData(List<T> data) {
        this.data = data;
    }
}

public class ServiceTest {
    public static void main(String[] args) {
        Service<User> result=new Service<User>();
        result.setData(Collections.emptyList()); // problem is here
    }
}

如何使用类型参数传递空列表?

编译器给我错误信息:

  

Service类型中的方法setData(List&lt; User&gt;)不是   适用于参数(List&lt; Object&gt;)

如果我尝试使用List进行转换,那么错误:

  

无法从List&lt;对象&gt;列出&lt;用户&gt;

result.setData(new ArrayList<User>());工作正常,但我不想传递它。

3 个答案:

答案 0 :(得分:11)

Collections.emptyList()是通用的,但您在原始版本中使用它。

您可以使用以下命令显式设置type-parameter:

result.setData(Collections.<User>emptyList());

答案 1 :(得分:6)

简单地  result.setData(Collections.<User>emptyList());

答案 2 :(得分:0)

  

您遇到的问题是即使是方法   emptyList()返回List,你没有提供类型,所以   它默认返回List。你可以提供这种类型   参数,并使您的代码按预期运行,如下所示:

  result.setData(Collections.<User>emptyList());
  

现在,当你进行直接赋值时,编译器可以搞清楚   你的泛型类型参数。它被称为类型推断。对于   例如,如果你这样做:

 List<User> emptyList = Collections.emptyList();
  

然后emptyList()调用将正确返回List。