当我定义一个方法来返回 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;
}
}
程序.java
public class Program extends Model {
...
}
我在 Programs.java 中收到不安全类型转换警告,即使我返回一个包含 Program 类型的对象的列表,该对象扩展了 Model 类,正如基类 <T extends Model>
中的方法签名所示。为什么?
最佳答案
protected abstract <T extends Model> List<T> getDataList();
这意味着将返回一个列表,该列表对于任何都必须是安全的 T
。例如:
List<SomeModel> someModelList = thing.getDataList();
如果您返回的列表是 List<Program>
,这将是不安全的 - 因为您可以添加 SomeModel
进入该列表,和/或您可以尝试获取 SomeModel
从列表中。如果Program
是 Program
的子类型/父类(super class)型,其中只有一项操作是安全的;否则,它们都是不安全的。
不要在方法上定义类型变量 - 将其放在类上:
abstract class TheClass<T extends Model> {
protected abstract List<T> getDataList();
}
class ProgramClass extends TheClass<Program> {
protected List<Program> getDataList() { return programs; }
}
关于java - 返回集合的通用方法给出不安全类型转换警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46234089/