final T t = null;
final U u = (U) t;
Хотя этот флажок снят, на самом деле это безопасно, поскольку null
может быть приведен к любому ссылочному типу без ClassCastException
.
Однако компилятор не учитывает значение ненулевая ссылка, когда вы ее разыгрываете: это просто «некоторые» T
. Это пример того, где вы, программист, знаете больше о типах, чем компилятор, потому что вы знаете, что t == null
, поэтому вы можете законно попросить компилятор доверять вам, добавив приведение и @SuppressWarnings
.
Но если бы t
было ненулевым, это не всегда было бы безопасно. T
и U
- это разные типы: «что-то, что расширяет A
» и «что-то (может быть, то же самое, может быть, нет), которое расширяет A
».
Чтобы сделать это немного немного конкретнее, вот эквивалентный пример:
class B<T extends Serializable, U extends Serializable> {
U method(T t) {
return (U) t;
}
}
String s = new B<Integer, String>().method(1);
Это не удастся с ClassCastException
, потому что Integer
не является String
.
Если вы не Чтобы они не были разных типов, удалите один из них (и, конечно, актерский состав).