К чему сводится весь этот код:
Vector<A> vector = new Vector<B>();
В этом случае B расширяет A, но это недопустимо, потому что типы не совпадают. Чтобы понять, почему это не работает, представьте следующий код:
Vector<Vector<?>> vector = new Vector<Vector<String>>();
vector.add(new Vector<Integer>());
Тип переменной - это вектор векторов неизвестного типа ; и ему присваивается вектор векторов строк . Во второй строке к этому добавляется вектор целых чисел . Тип компонента переменной Vector<?>
, который принимает Vector<Integer>
; но фактический тип компонента вектора Vector<String>
, который не делает. Если компилятор не возражает против присвоения в первой строке, он позволит вам написать неверную вторую строку, не будучи замеченным.
Обобщения C # имеют аналогичное ограничение, но отличие состоит в том, что универсальный класс в C # сохраняет тип компонента, в то время как Java забывает типы компонентов при компиляции кода.
пс - с какой стати вы используете Vector
вместо LinkedList
или ArrayList
? Это из-за проблем с многопоточностью?