Collections.emptyList() returns a List<Object>?
我在导航Java规则中遇到了一些困难,用于推断泛型类型参数。考虑下面的类,它有一个可选的列表参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import java.util.Collections; import java.util.List; public class Person { private String name; private List<String> nicknames; public Person(String name) { this(name,Collections.emptyList()); } public Person(String name,List<String> nicknames) { this.name = name; this.nicknames = nicknames; } } |
我的Java编译器给出以下错误:
1 |
但
1 2 3 |
产量
1 | Person.java:9: inconvertible types |
使用
1 2 3 |
产量
1 | Person.java:9: warning: [unchecked] unchecked conversion |
但是,以下更改会使错误消失:
1 2 3 4 |
有人能解释一下我在这里遇到的是什么类型的检查规则,以及解决这个问题的最佳方法吗?在这个例子中,最后一个代码示例是令人满意的,但是对于较大的类,我希望能够按照这个"可选参数"模式编写方法,而不需要重复代码。
额外贷款:何时使用
您遇到的问题是,尽管方法
1 2 3 |
现在,当您执行直接赋值时,编译器可以为您计算出泛型类型参数。这叫做类型推理。例如,如果您这样做:
1 2 3 4 | public Person(String name) { List<String> emptyList = Collections.emptyList(); this(name, emptyList); } |
然后,
您要使用:
1 |
如果你在源代码中查找空列表,你会发现它实际上只做了一个
1 | return (List<T>)EMPTY_LIST; |
EmptyList方法具有以下签名:
1 | public static final <T> List<T> emptyList() |
单词列表前的
1 |
然后返回值被
1 |
编译器没有明确的返回变量来计算泛型类型,因此它默认为