使用 Class<T> 的派生工厂转换错误
Conversion error on derivated Factory using Class<T>
以下最小示例在 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)
应该是有效的并且对我有用很多次。所以转换应该不是问题,错误根本没有帮助。
我花了几个小时来创建一个最小的示例(我的原始项目更复杂并且涉及 Android 特定代码)。当我将最小示例复制到 Eclipse 时,我意识到我忘记将 MyFactory
上的模板参数添加到 extend Factory<MyFactory>
。 Eclipse 警告我扩展原始类型。该原始类型不提供成员函数 empty()
和 returns Collection
而不是 T extends Collection
.
的通用参数
Android Studio 实际上可以在原始类型上创建警告,但默认情况下它是禁用的。有关如何启用它的信息,请参阅 。
希望对遇到同样问题的人有所帮助。
以下最小示例在 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)
应该是有效的并且对我有用很多次。所以转换应该不是问题,错误根本没有帮助。
我花了几个小时来创建一个最小的示例(我的原始项目更复杂并且涉及 Android 特定代码)。当我将最小示例复制到 Eclipse 时,我意识到我忘记将 MyFactory
上的模板参数添加到 extend Factory<MyFactory>
。 Eclipse 警告我扩展原始类型。该原始类型不提供成员函数 empty()
和 returns Collection
而不是 T extends Collection
.
Android Studio 实际上可以在原始类型上创建警告,但默认情况下它是禁用的。有关如何启用它的信息,请参阅
希望对遇到同样问题的人有所帮助。