Search code examples
javalistgenericsbounded-types

Cast to generic type (T) gives "unchecked cast" warning


I got a small problem here regarding generics bounded type with lists. Please help out!

Model.java

public class Model {
}

ClassA.java

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

    public ClassA() {
        models.add((T) new Model());
    }
}

It gives me an unchecked cast from Model to T warning on this line:

models.add((T) new Model());

I understand I'm getting this warning because all I can safely cast from a sub class into a super class but not the other way round.

Is there any way to get over this problem or can I just safely supress the warning?


Solution

  • You can't do what you're trying to do.

    Since T is a subclass of Model:

    • every T is a Model
    • but not every Model is a T.

    Specifically:

    If you construct a new Model by calling new Model(), the instance is exactly a Model and not an instance of any subclass.

    Where Subclass extends Superclass, you can never successfully do this:

    (Subclass) new Superclass();
    

    Because of this, you can not successfully cast a new Model to an instance of T.

    The compiler will just give you a warning which you can either ignore or suppress, but you'll get a ClassCastException when you run your program and call the add() method.