我不理解以下代码导致的编译错误。我定义了一个泛型接口Task,其中包含两个方法:
U doSomething(String value)
和List<Integer> getIDs()
。doSomething()方法实际上使用泛型类型作为返回值的类型,但似乎没有引起问题。getIDs()方法返回一个与Task类型无关的List,在使用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 );
}
}
return new int[]{1,2,3,4}
或者return Arrays.asList( new Integer(1), new Integer(2), ...);
这样的语句会发生什么?(注意,不是假设性的问题。试一下,将结果添加到问题中以显示装箱/拆箱明显做了一些奇怪的事情) - Mike 'Pomax' KamermansU doSomething(String value)
改成了U doSomething(U value)
吗?我认为发布的代码并没有实际上OP想要做的事情。 - Bhesh GurungTask task
,它会从类定义中删除所有泛型,包括getIDs
上的<Integer>
。不确定这是一个错误还是特性。 - Kevin