返回集合的通用方法,给出不安全的类型转换警告

时间:2017-09-15 07:30:40

标签: java generics types

当我定义一个返回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>。为什么呢?

1 个答案:

答案 0 :(得分:6)

protected abstract <T extends Model> List<T> getDataList();

这意味着将返回一个列表,该列表必须对任何 T安全。例如:

List<SomeModel> someModelList = thing.getDataList();

如果您要返回的列表是List<Program>,这将是不安全的 - 因为您可以在该列表中添加SomeModel,并且/或者您可以尝试获取列表中的SomeModel。如果ProgramProgram的子类型/超类型,则其中一个操作是安全的;否则,它们都是不安全的。

不要在方法上定义类型变量 - 将它放在类上:

abstract class TheClass<T extends Model> {
  protected abstract List<T> getDataList();
}

class ProgramClass extends TheClass<Program> {
  protected List<Program> getDataList() { return programs; }
}