Проблема с использованием функции addAll () вектора, когда вектор находится в содержащем классе - PullRequest
0 голосов
/ 27 декабря 2011

Используя Java 6 SE, у меня есть класс, который содержит Vector.Существует метод класса, который просто вызывает содержащийся метод Vector addAll () с одинаковыми параметрами для каждого.Векторы могут иметь тип «Суперкласс» или «Подкласс», и я хочу, чтобы методы addAll () поддерживали оба.Вся эта установка может выглядеть следующим образом:

public class VectorAContainer(){
    this.vectorA = new Vector<Superclass>();
}

public void addAll(Vector<Superclass> vector){
    this.vectorA.addAll(vector);
}

Затем я хочу вызвать строку кода следующим образом:

VectorAContainer container = new VectorAContainer();
container.addAll(vectorB); //where vectorB is a Vector<Subclass>

Проблема в том, что Eclipse выдает следующую ошибку:

"Метод addAll (Vector ) в типе VectorAContainer не применим для аргументов (Vector )."

Как ни странно, я обнаружил, чтоaddAll () работает, если он НЕ внутри класса:

//No container with an addAll(), calling directly on vectorA
this.vectorA.addAll(vectorB); //No errors!

Я не вижу разницы между двумя вышеупомянутыми случаями.Я хотел бы получить первый способ работы, потому что у меня есть намного более сложный класс, который содержит Вектор, подобный приведенному выше.Я был бы очень признателен за любую помощь, которую вы все могли бы оказать!

Ответы [ 2 ]

2 голосов
/ 27 декабря 2011

Вам необходимо принять ковариантный универсальный параметр:

public void addAll(Collection<? extends Superclass> c)

Это можно увидеть в объявлении addAll:

boolean addAll(Collection<? extends E> c)
0 голосов
/ 27 декабря 2011

Это потому, что Superclass - это нижняя граница аннотации, означающая классы от Super до Vector. Если vectorB является подклассом для Vector, он не будет работать. AbstractList и AbstractCollection являются супер для вектора. Я верю, что вы хотите использовать. public void addAll(Vector<? extends Vector> vector){ vectorA.addAll(vector); }

P.S. Вектор является устаревшим классом. Вы должны использовать ArrayList, если вам не нужна поточно-ориентированная реализация.

* P.P.S. Вам не нужно использовать «this», если у вас нет двух переменных с одинаковым именем (например,

private Variable variableA;

public void example(Variable variableA){

this.variableA = variableA;

}

...