返回一个给出不安全类型集合的泛型方法抛出警告
当我定义一个返回Type类的方法时,我不应该能够用任何扩展Base类型的方法重写该方法吗?看看下面的例子:返回一个给出不安全类型集合的泛型方法抛出警告
MultiEntryModel.java(父类)
protected abstract <T extends Model> List<T> getDataList();
ProgramData.java
public class ProgramData extends MultiEntryModel {
...
@Override
protected List<Program> getDataList() {
return programs;
}
}
Program.java
public class Program extends Model {
...
}
我发现了一个不安全的类型在Programs.java中抛出警告,尽管我返回的是一个包含Program类型对象的List,它扩展了Mod el类,正如基类<T extends Model>
中的方法签名所示。为什么?
protected abstract <T extends Model> List<T> getDataList();
这意味着列表将恢复它有成为任何T
安全。例如:
List<SomeModel> someModelList = thing.getDataList();
如果你返回列表是一个List<Program>
,这将是不安全的 - 因为你可以添加一个SomeModel
进入该名单,以及/或者你可以尝试获取来自一个SomeModel
名单。如果Program
是Program
的子类型/超类型,那么其中的一个操作是安全的;否则,它们都是不安全的。
不要定义的类型变量的方法 - 把它放在类:
abstract class TheClass<T extends Model> {
protected abstract List<T> getDataList();
}
class ProgramClass extends TheClass<Program> {
protected List<Program> getDataList() { return programs; }
}
非常有趣,很好的解释。谢谢! :) – user1452030
调用者甚至没有绑定到'Model'的现有子类。用'
后一个完整的小例子,重现问题,用准确,完整的错误消息一起。在您发布的代码中根本没有演员。 –
没有铸件。 Programs.java中的警告出现在方法被覆盖的地方。 – user1452030