Следующий код Java НЕ генерирует непроверенное предупреждение о приведении (тестирование с помощью компилятора Eclipse для Java 8):
class Parent<T> {}
class Child<T> extends Parent<T> {}
class Test {
<T> void test() {
Parent<T> p = new Child<T>();
// cast accepted by compiler:
Child<T> cast = (Child<T>)p;
}
}
Итак, я понимаю, что компилятор, должно быть, каким-то образом обнаружил, что если p
является и Parent<T>
(по типу времени компиляции), и Child
(по типу исполнения во время выполнения), то можно предположить, что это Child<T>
, поскольку Child
передает свой параметр типа в предложении extends
.
Однако следующий подобный код генерирует непроверенное предупреждение о приведении:
class Parent<T> {}
class Child<T, U> extends Parent<T> {}
class Test {
<T, U> void test() {
Parent<T> p = new Child<T, U>();
// cast considered unsafe by compiler:
Child<T, ?> cast = (Child<T, ?>)p;
}
}
Тем не менее, рассуждения о первом безопасном примере также должны применяться здесь! Если p
является Parent<T>
и Child
, то это должно быть Child<T, ?>
, учитывая Child
'extends
предложение!
(Обратите внимание, что я НЕ включаю U
в приведение, потому что это действительно не может быть проверено ни во время компиляции, ни во время выполнения.)
Есть ли способ привести к подтипу, имеющему дополнительные параметры, без предупреждений?