【问题标题】:java generics compilation errorjava泛型编译错误
【发布时间】:2011-02-04 09:10:26
【问题描述】:

我有以下通用类:

public class GenericClass<E,T extends Comparable<T>>
{
    public static <E, T extends Comparable<T>> GenericClass<E, T> create()
    {
        return new GenericClass<E, T>();
    }

    private GenericClass()
    {
    }
}

这就是我简单地使用它的方式:

GenericClass<MyClass, Double> set = GenericClass.create();

Eclipse 编译没有显示错误,但是 - 使用 ant 构建会提供以下错误:

MyClass.java:19: incompatible types; no instance(s) of type variable(s) E,T exist so that GenericClass<E,T> conforms to GenericClass<MyClass,java.lang.Double>
[javac] found   : <E,T>GenericClass<E,T>
[javac] required: GenericClass<MyClass,java.lang.Double>
[javac]             GenericClass<MyClass, Double> set = GenericClass.create();

谢谢!

【问题讨论】:

  • 而 SortedSetByDoubleValue 是...?
  • 已修复...为简单起见,我更改了类名
  • 我的建议是不要在静态方法 create 和类中为泛型类型使用相同的名称。虽然它在技术上是合法的,但它可能会导致一些难以发现的疯狂错误。我强烈建议在整个 create() 定义中用 E2 和 T2(或其他)替换 E,T。
  • 为了获得子类的最佳结果,边界应为T extends Comparable&lt;? super T&gt;

标签: java generics compiler-errors


【解决方案1】:

试试这个:

      GenericClass<String, Double> set = GenericClass.<String,Double>create();

Eclipse 编译器和 javac 的容差不同。

【讨论】:

  • 那么 Google 的 Sets.newHashSet()(例如)是如何工作的?有什么区别?
  • @duduamar: newHashSet() 不那么复杂:它对两个类型参数没有限制。
【解决方案2】:

您的表达式GenericClass.create() 没有类型指示,因此编译器无法推断 E 和 T 的真实类型。您需要更改函数的原型以帮助编译器。

最简单的方法是传递类。

例子:

public class GenericClass<E,T extends Comparable<T>> {
    public static <E, T extends Comparable<T>> GenericClass<E, T> create(Class<E> e, Class<T> t) {
        return new GenericClass<E, T>();
    }

    private GenericClass() {
    }
}

GenericClass<MyClass, Double> set = GenericClass.create(MyClass.class, Double.class);

【讨论】:

  • 编译器应该能够推断出类型。这是可能的(正如eclipse编译器清楚地展示的那样)。我发现了类似的错误,javac 无法推断类型而 eclipse 编译器能够。每次我为它(Eclipse 和 Sun/Oracle)提交错误时,结果都是 javac 有问题。
  • 是的...但 javac 是参考 ;-) 无论如何,感谢 Grzegorz,我学到了一些新东西。
猜你喜欢
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
相关资源
最近更新 更多