我无法理解为什么我的界面参数化不起作用.我们来看下面的代码:
public interface IType {
public List<String> getAllItems();
}
......
public void function(IType item) {
for (String str : item.getAllItems()) { //DOESN'T WORK! Incompoatible types. Required String, Found: Object
}
}
Run Code Online (Sandbox Code Playgroud)
为什么它会返回List<Object>而不是List<String>?
我将假设您IType实际上是一个参数化(并且您刚刚确认它)类型
public interface IType<E> {
public List<String> getAllItems();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果将变量(或参数)声明为
IType item;
Run Code Online (Sandbox Code Playgroud)
您正在使用原始类型.使用原始类型的变量,将删除在该变量上访问的方法或字段中的所有泛型类型.所以
public List<String> getAllItems();
Run Code Online (Sandbox Code Playgroud)
变
public List getAllItems();
Run Code Online (Sandbox Code Playgroud)
所以List Iterator将返回类型的引用Object.
public void function(IType item) {
for (String str : item.getAllItems()) { // DOESN'T WORK! Incompoatible
// types. Required String,
// Found: Object
}
}
Run Code Online (Sandbox Code Playgroud)