Java:Raw Type对象中的泛型类型或我的参数化不起作用的原因

VB_*_*VB_ -1 java generics

我无法理解为什么我的界面参数化不起作用.我们来看下面的代码:

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>

Sot*_*lis 6

我将假设您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)

结合原始类型和通用方法