为什么我的通用方法停止工作?

时间:2009-08-10 13:32:43

标签: java eclipse generics

在我的项目中,我有一个工厂方法,用于加载实现接口的对象。你传入你想要的课程并接受它的实例化,就像这样。

public class Factory {
    public static <E extends SomeInterface> E load( Class<E> clss ) throws Exception {
        return clss.newInstance();
    }
}

您可以这样调用它:

MyObject obj = Factory.load( MyObject.class );

这个代码在Eclipse 3.4和Java 6u13中运行得很好,但是今天我收到了一台新的笔记本电脑并安装了Eclipse 3.5和java 6u15,现在到处都是类型不匹配。

MyObject obj = Factory.load( MyObject.class );
               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
               Type mismatch: cannot convert from SomeInterface to MyObject

在工厂之前在该线上施放一个石膏使它消失并且一切运行良好,但它使线条变得不那么干净,之前我不需要它,所以它给出了什么?

4 个答案:

答案 0 :(得分:2)

您最近是否在工厂类中添加了类型参数?原始类型的泛型方法存在缺陷:

  public class FooFactory<UnrelatedArg> {
    public <E> E load(Class<E> c) { ... }
  }

  FooFactory<?> f; f.load(String.class); // returns String
  FooFactory    f; f.load(String.class); // returns Object

答案 1 :(得分:1)

是否需要获取此错误所需的所有代码?我在今天看到的一些代码中看到过非常相似的东西。还有一个附加参数传递到Factory方法的等效项中,该方法也具有泛型类型。这是缺少它的通用定义,我认为应该归咎于混淆编译器。

即,如果您的工厂方法看起来像

public class Factory {
    public static <E extends SomeInterface> E load( Class<E> class, Key key ) {
        // return an instance of E
    }
}

哪里有一些Key类被定义为这样的

public class Key<Datatype> {
    ....
}

给这样的东西调用方法,注意关键

的声明没有泛型
Key key = new Key()
MyObject obj = Factory.load( MyObject.class, key );

希望有所帮助,

答案 2 :(得分:0)

我认为这与Java合规性级别有关。默认情况下,项目具有默认级别。您在Eclipse首选项中设置的内容。在旧的安装中,您将对其进行更改。

答案 3 :(得分:0)