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

标签 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;
        }
}

程序.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从列表中。如果ProgramProgram 的子类型/父类(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/

相关文章:

scala - 方法参数中的抽象类型

MySQL "0 or 1"CSV 文件中的列导入为 "127"

python - Union 赋值中的不兼容类型

java - JavaFX 元素中的 CSS 错误

java - Intellij 给出了奇怪的错误。 Java 泛型问题

c# - 在 f# : can't get the type right 中实现 C# 接口(interface)

c# - 如何检查 ValueTuple 列表是否为 C# 7 中的 List<ValueTuple> 类型

JavaFX : how to change a scene included in the center of a BorderPane

java - 带有spring mvc的ajax总是出错

java - 将对象从列表传输到数组