/ / Java: Generic casting down генерира предупреждение, защо? - java, generics, compiler-warnings

Java: Общото отхвърляне генерира предупреждение, защо? - Java, генерични, предупреждения за компилатора

Не разбирам защо следният код генерира предупреждение.

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`.