当前位置: 首页 > 知识库问答 >
问题:

带有list方法的Java泛型接口上的编译器错误[duplicate]

宗翔宇
2023-03-14
error: incompatible types
    for (Integer value : task.getIDs()){
required: Integer
found:    Object

显然,如果我得到了引用的列表外面的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;而让Answer告诉我这是问题所在。

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 );
   }
}

共有1个答案

糜宜民
2023-03-14

发生的情况是,当使用具有泛型参数 的类(或接口)但引用不具有 (即raw类型)的实例时,编译器将从类中擦除所有泛型类型信息。这可能是由于与-1.5之前的源代码兼容,在该源代码中,您根本无法使用泛型类型信息。

考虑一下在Java1.4编译器上编写代码和编译的情况。您希望使用一个利用泛型的库。当从该库中引用具有泛型参数作为原始类型的类型时,编译器强制不使用泛型参数。

编辑:

 类似资料:
  • 在处理一些旧代码时,我偶然发现了一个问题,用lambda表达式或方法引用替换了几个匿名类。这个问题有点难以用语言来解释,但我会尽我所能,下面我还添加了一个简短的例子,尽我所能来说明我的问题。 我的示例包括。。。 > 一个函数接口,GenericListener,它接受类型参数V并具有单个方法“GenericCallback(V GenericValue)”。 一个类,CallbackProduce

  • 下面是我试图做的一个非常简单的说明: 最后一个方法调用(consumer.consumer())给了我一个编译器错误 Out projected type’EventConsumer 我知道Kotlin对泛型的要求比Java严格得多,这可能就是它不起作用的原因,但我该如何正确地实现这样的东西呢?

  • get1方法工作正常,但get2存在编译错误: > 类型A.B的方法get2(集合)必须重写或实现超类型方法 只有带有泛型的参数才会出现此错误<代码>get3编译,但当然有一个警告: > 显然还有其他方法可以解决这个问题,但在我的理解中,这应该是一个法律优先事项,我的问题更多的是为什么会有这个编译错误。提前谢谢! 编辑: 对不起,我的例子不够清楚。因此,这里有一个新的答案来回应你的一些观点。 与上

  • 编译时,此代码将产生以下+错误: 问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?

  • Java中是否有一种方法可以通过一个方法的声明返回不同的类型? 我希望此方法返回一个对象,并在函数调用时将其转换为正确的类型。这就是我的想法,但它不是这样工作的。我是否需要某种通用返回类型来执行此操作?解决这个问题的最佳方法是什么?