2015-04-19 2 views
1

Есть ли способ добавить данные в общую коллекцию на Java. Для, например: -Добавить данные в общую коллекцию в java

import java.util.List; 
import java.util.Vector; 

public class testGenerics { 
    public static void main(String args[]) {  
     Vector<? extends Number> superNumberList = null; 

     // I can do this 
     Vector<Integer> subList = new Vector<Integer>(); 
     subList.add(2); 
     superNumberList = subList; 

     // But i cannot do this 
     // Gives the below compilation error. 
     //The method add(capture#2-of ? extends Number) in the type 
     //Vector<capture#2-of ? extends Number> is not applicable for the arguments (Integer)   
     superNumberList = new Vector<Integer>(); 
     superNumberList.add(new Integer(4)); 

     superNumberList = new Vector<Float>(); 
     superNumberList.add(new Float(4)); 
    } 

} 

Как упоминалось в моих комментариях я есть ошибки компиляции, когда я пытаюсь добавить Integer или Float данные в superNumberList.

Я в состоянии сделать это, первым способом, но хотел бы сделать это вторым способом и не уверен, почему Java не позволяет мне сделать это вторым способом.

У меня есть suitation, где у меня есть супер класс, который имеет этот superNumberList и все подклассы пытаются использовать эту же переменную, но имеет различные типы данных в этой коллекции, как Integer, Float и т.д.

ответ

3

Vector<? extends Number> является Вектор неизвестного типа номера. Таким образом, вы не можете добавить что-нибудь в него.

Это может быть Vector<Float>. Поэтому вы не можете добавить Integer.

Но это также может быть Vector<Integer>. Поэтому вы не можете добавить Float.

Единственное, что вы знаете об этом, это то, что вы нажмете из из Vector будет Number.


Если у вас есть суперкласс, который имеет подклассы для Integer, Float и так далее, вы должны сделать суперкласс родовым:

class SuperClassWithVector<T extends Number>{ 
    protected Vector<T> myVector; 
} 

class FloatSubClass extends SuperClassWithVector<Float>{ 
    // here myVector takes Float 
} 

Если вы хотите Vector, который может принимать как Integer и Float (не уверен, что это то, что вы хотите), то вы можете использовать Vector<Number>.

+0

Это объясняет, почему, но он не отвечает «есть способ ...» часть. –

0

Вам не нужно использовать ? extends Number:

Vector<Number> superNumberList = null; 
... 
superNumberList = new Vector<Number>(); 
superNumberList.add(new Integer(4)); 
superNumberList.add(new Float(4)); 
+0

Вы уверены, что подстановочный знак лишний? Если клиентский код уже определил «Вектор », он не может передать это как «Вектор » без неконтролируемого явного приведения. –

+0

Если код клиента уже был определен как вектор , вы никогда не сможете добавить к нему Float. Кроме того, явная передача вектора в вектор является ошибкой. – pathfinderelite

+0

Аналогичным образом, литье вектора в вектор является ошибкой. – pathfinderelite

Смежные вопросы