我不明白以下代码导致的编译器错误。我定义了一个通用接口,请参阅任务,它有两种方法:U doSomething(String value)
和List<Integer> getIDs()
. doSomething() 方法实际上使用泛型类型作为其返回值的类型,但似乎没有引起问题。该getIDs()
方法返回一个List,它与Task的类型无关,但是在使用for..each语句迭代返回值时会导致问题。发生以下编译器错误。
error: incompatible types for (Integer value : task.getIDs()){ required: Integer found: Object
似乎接口上的类型擦除导致编译器忘记了第二种方法上声明的类型,这与泛型类型无关。或者换句话说,为什么接口上的泛型类型会影响编译器如何理解getIDs()
方法的返回值,特别是在 for..each 语句的上下文中?
显然,如果我得到对 for..each 之外的列表的引用,则没有问题,但不是直接的。
public class InterfaceTest {
public static void main(String[] args) {
Task task = new MyTask();
// no complaints about the type here
List<Integer> values = task.getIDs();
// getting a compiler error for this line
for (Integer value : task.getIDs()){
}
}
}
interface Task<U>{
U doSomething(String value);
List<Integer> getIDs();
}
接口的实现不需要说明这一点,但我不想留下参考Task task = null;
并有答案告诉我这就是问题所在。
class MyTask implements Task<Boolean>{
@Override
public Boolean doSomething(String value) {
System.out.println(value);
return false;
}
@Override
public List<Integer> getIDs() {
return Arrays.asList( 1, 2, 3, 4 );
}
}