当我定义一个返回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中收到了一个不安全的类型转换警告,即使我正在返回一个List,其中包含类型为Program的对象,它扩展了Model类,正如方法签名所示。基类<T extends Model>
。为什么呢?
答案 0 :(得分:6)
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; }
}