代码之家  ›  专栏  ›  技术社区  ›  banjollity

为什么我的泛型方法停止工作?

  •  4
  • banjollity  · 技术社区  · 15 年前

    在我的项目中,我有一个工厂方法,它加载一个实现接口的对象。你通过了你想要的课程,并收到了它的一个实例,就像这样。

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

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

    这个代码在Java6U13中在Eclipse 3.4中运行良好,但是今天我收到了一个新的笔记本电脑,安装了Eclipse 3.5和Java6U15,现在我到处都是类型不匹配。

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

    在生产线上把铸模放在工厂前面会让它消失,并且运行良好,但这会使生产线变得不干净,我以前不需要它,所以什么会给予?

    4 回复  |  直到 15 年前
        1
  •  1
  •   Robin    15 年前

    这就是获得这个bug所需的所有代码吗?我在今天看到的一些代码中看到了非常相似的东西。有一个额外的参数被传递到您的工厂方法的等价物中,它也有一个泛型类型。这缺少了它的一般定义,我认为这是导致编译器混乱的原因。

    如果你的工厂方法看起来像

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

    其中有一些键类定义如下

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

    通过这样的方法来调用方法,注意键声明中没有泛型

    Key key = new Key()
    MyObject obj = Factory.load( MyObject.class, key );
    

    希望能有所帮助,

        2
  •  2
  •   ealf    15 年前

    最近是否向工厂类添加了类型参数?在原始类型上有一个通用方法的陷阱:

      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
    
        3
  •  0
  •       15 年前

    我认为这与Java编译级别有关。默认情况下,项目具有默认级别。在Eclipse首选项中设置。在旧的安装中,您将更改它。