转换为泛型类型(T)会发出"未经检查的强制转换"警告

Ter*_*Lam 5 java generics list bounded-types

关于带有列表的泛型有界类型,我遇到了一个小问题.请帮忙!

Model.java

public class Model {
}
Run Code Online (Sandbox Code Playgroud)

ClassA.java

public class ClassA<T extends Model> {
    private List<T> models;

    public ClassA() {
        models.add((T) new Model());
    }
}
Run Code Online (Sandbox Code Playgroud)

它在这一行给我一个从模型到T警告的未经检查的强制转换:

models.add((T) new Model());
Run Code Online (Sandbox Code Playgroud)

我知道我收到了这个警告,因为我可以安全地从一个子类投射到一个超级类而不是反过来.

有没有办法解决这个问题,还是我可以安全地压制警告?

Jam*_*unn 10

你无法做你想做的事.

由于TModel的子类:

  • 每个T都是一个模型
  • 但并不是每一个模型是一个牛逼.

特别:

如果通过调用new Model()来构造新模型,则实例恰好是Model而不是任何子类的实例.

子类扩展超类,你永远不能成功地做到这一点:

(Subclass) new Superclass();
Run Code Online (Sandbox Code Playgroud)

因此,您无法成功将新模型强制转换为T的实例.

编译器只会给你一个警告,你可以忽略或抑制,但是当你运行你的程序并调用add()方法时你会得到一个ClassCastException.