使用Class <t>对派生工厂的转换错误

时间:2017-07-07 19:11:13

标签: java android-studio generics factory

下面的犯罪示例在Android Studio上出现错误“Collection无法转换为LinkedList”:

class Factory<F extends Factory<F>> {

   public <T extends Collection<?>> T empty(Class<T> clazz) {
       try {
           return clazz.newInstance();
       } catch (Exception e) {
           throw new Error(e);
       }
   }

}

class MyFactory extends Factory {

   // ERROR is displayed here
   LinkedList<?> list = empty(LinkedList.class);  

}

我试图删除该错误,但无法弄清楚问题是什么。构造T create(Class<T> clazz)应该是有效的并且为我工作了很多次。所以转换不应该是问题而且错误根本没有用。

1 个答案:

答案 0 :(得分:0)

花了我几个小时来创建一个最小的exmaple(我的原始项目更复杂,涉及Android特定代码)。当我将最小的例子复制到eclipse时,我发现我忘了将MyFactory上的模板参数添加到extend Factory<MyFactory>。 Eclipse给了我一个扩展原始类型的警告。该raw-type不提供成员函数empty()的通用参数,并返回Collection而不是T extends Collection

Android Studio实际上可以在原始类型上创建警告,但默认情况下会禁用它。请参阅this thread了解如何启用它。

我希望这可以帮助遇到同样问题的人。