使用 List<> 方法的 Java 泛型接口上的编译器错误
我不明白以下代码导致的编译器错误。我定义了一个通用接口,请参阅任务,使用两种方法:和。doSomething() 方法实际上使用泛型类型作为其返回值的类型,但似乎不会引起问题。该方法返回一个 List,该列表与 Task 的类型无关,但在使用 for.. 时会导致问题。每个语句以循环访问返回值。发生以下编译器错误。U doSomething(String value)List<Integer> getIDs()getIDs()
error: incompatible types for (Integer value : task.getIDs()){ required: Integer found: Object
接口上的类型擦除似乎导致编译器忘记了第二个方法上的声明类型,这与泛型类型无关。或者换句话说,为什么接口上的泛型类型会影响编译器如何理解getIDs()方法上的返回值,特别是在for.的上下文中。每个语句?
显然,如果我得到参考列表之外的for..每个都没有问题,但不是直接的。
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 );
   }
}
 
					 
				 
				    		 
				    		 
				    		 
				    		