当前位置: 首页 > 面试题库 >

泛型可以在Eclipse中编译和运行,但不能在javac中编译

束阳旭
2023-03-14
问题内容

注意:这是从Comparable和Comparator合约衍生出来的,涉及null

该代码可以在Eclipse(20090920-1017)中编译并正常运行

import java.util.*;
public class SortNull {
   static <T extends Comparable<? super T>>
   Comparator<T> nullComparableComparator() {
      return new Comparator<T>() {
         @Override public int compare(T el1, T el2) {
         return
            el1 == null ? -1 :
            el2 == null ? +1 :
            el1.compareTo(el2);
         }
      };
   }
   public static void main(String[] args) {
      List<Integer> numbers = new ArrayList<Integer>(
         Arrays.asList(3, 2, 1, null, null, 0)
      );
      Comparator<Integer> numbersComp = nullComparableComparator();
      Collections.sort(numbers, numbersComp);
      System.out.println(numbers);
      // "[null, null, 0, 1, 2, 3]"

      List<String> names = new ArrayList<String>(
         Arrays.asList("Bob", null, "Alice", "Carol")
      );
      Comparator<String> namesComp = nullComparableComparator();
      Collections.sort(names, namesComp);
      System.out.println(names);
      // "[null, Alice, Bob, Carol]"
   }
}

但是它不能在上编译javac 1.6.0_17。这是错误消息:

SortNull.java:17: incompatible types; no instance(s) of type variable(s) T exist
 so that java.util.Comparator<T> conforms
 to java.util.Comparator<java.lang.Integer>
found   : <T>java.util.Comparator<T>
required: java.util.Comparator<java.lang.Integer>
     Comparator<Integer> numbersComp = nullComparableComparator();

SortNull.java:25: incompatible types; no instance(s) of type variable(s) T exist
 so that java.util.Comparator<T> conforms
 to java.util.Comparator<java.lang.String>
found   : <T>java.util.Comparator<T>
required: java.util.Comparator<java.lang.String>
     Comparator<String> namesComp = nullComparableComparator();

2 errors

有人可以解释为什么差异吗?这是一个错误吗?如果是这样,谁有错误?


问题答案:

这是一个已确认的错误:错误ID 6468354。这是相关的摘录:

此问题是由以下事实引起的:有时javac的JLS3 15.12.2.8实现忽略了递归边界,有时却忽略了(在这种情况下)。当递归边界包含通配符时,在计算未推断类型变量时将包括此类边界。这样可以进行后续的子类型化test (Integer <: Comparable<? super T>,其中T要推断出类型变量。

将在6369605之后修复

在WinXP上也以1.6.0_13出现在我身上。嗯,我只是坚持使用Eclipse :)



 类似资料:
  • 问题内容: 我不得不发现我的项目中有Java代码,该代码可以在Eclipse中编译并正常运行,但是会在javac中引发编译错误。 一个完整的代码段: javac中的编译返回: 现在,此错误阻止在Maven中构建项目。由于Eclipse编译器具有更高的容忍度,因此我现在不得不假设代码段的定义和用法如上所述,静态方法不是有效的Java吗? 问题答案: 似乎Sun的1.6 JDK无法推断正确的类型。以下

  • 问题内容: 我知道过去有一些关于在Eclipse中编译但不能在命令行中编译的问题,但是我还无法找到解决问题的答案。 特别是,我认为我可以设置eclipse以使用我的系统编译器,但这仍然不能解决问题。 我目前正在检查以下内容:“首选项-> Java->已安装的JRE”。 它仅包含一个JRE,这是我的系统之一。 这是问题的细节 我有一个Java通用类,将Enum类型作为参数,如下所示: 我在类中的某个

  • 问题内容: 抱歉,标题含糊。我有这段代码可以在Eclipse Juno(4.2)上编译,但不能在javac(1.7.0_09)上编译: 错误是: 所以问题是: 这是Bug还是Eclipse错误? 有什么办法可以在不更改方法签名的情况下进行编译(即保留通配符)? 我知道将其更改为确实可以使其编译,但是我想知道是否有办法首先避免这种情况。另外,由于内容的类型需要严格的约束,因此无法将方法更改为。 问题

  • 我对龙目岛或月食有问题,不确定是哪一个。我有一个Spring Boot maven项目,我正在使用Lombok。我在pom中添加了这个。xml文件,我使用了用于eclipse的lombok安装。 发生的事情是,我可以对项目进行和以及maven更新,一切都按预期构建。一旦我去运行项目,错误就开始出现,我得到错误,例如: 在运行项目时,有什么事情可以让龙目岛脱颖而出吗?! 我正在运行Eclipse O

  • 从原子函数指针调用函数时,如: gcc一点也不抱怨,而clang和msvc在调用时有问题: [clang]:错误:调用类型为'std::atomic的对象 Clang还指定可能的呼叫候选者为: 波动性的这种差异似乎让clang和msvc感到困惑,但海湾合作委员会却没有。 当调用从更改为

  • 在下面的情况下,我在理解Java泛型的行为时遇到了问题。 具有一些参数化接口和一些类上的方法,这些类返回扩展该接口的类,由、1.8Oracle JDK、OSX和Linux生成java编译错误,但不是由Eclipse IDE中的Eclipse编译器生成的(它也可以在Eclipse RCP OSGi运行时下运行),实现如下: ./Gradlew build 最简单的修复是删除方法签名中泛型定义的一部分