Не разбирам защо следният код генерира предупреждение.
interface Generic<T> {
}
interface A {
}
class B {
Generic<A> c;
<T extends A> B(Generic<T> a) {
c = (Generic<A>) a; //warning here
}
}
//Unchecked cast from Generic<T> to Generic<A>
В клас B аз се интересувам само от използването на копия на Generic, които са от тип A. Това предупреждение предполага, че трябва да запазя общия аргумент като T вместо A.
Но това означава, че ще трябва да декларирам и генеричната група B, която изглежда прави нещата по-сложни, отколкото е необходимо.
Отговори:
6 за отговор № 1Това не е низходящо, тъй като Java generics са инвариантни: Generic<T>
не е подтип на Generic<A>
въпреки че T е подтип на A. Ако имате нужда само от генерични методи, които връщат A, можете да използвате заместващ символ Generic<? extends A>
в B конструктор и в полето, което съхранява референцията.
5 за отговор № 2
Защото Generic<T>
не е подтип от Generic<A>
дори ако T
е подтип на A
.
За да илюстрирате това, помислете String
примерно на Object
:
List<String> listOfStrings = new ArrayList<String>();
List<Object> listOfObjects = (List<Object>)listOfStrings; // invalid
listOfObjects.add(new Date());
// now listOfStrings contain a date!
Компилаторът не позволява това, защото може да причини повреждане на оригиналния списък.
Решението тук е да се обяви полето c
тип като "Generic`.