Java 使用';?扩展';和';?超级';集合中的泛型

Java 使用';?扩展';和';?超级';集合中的泛型,java,generics,collections,Java,Generics,Collections,有人能解释一下为什么我们在集合中使用?泛型吗 例如: List<? extends Number> numberlist; List<? super Integer> numberlist; 列表?在使用泛型时用于定义 示例中的语句告诉您,List接受任何类型的对象Number?表示任何这样的类 ? extends MyClass 是指MyClass的任何子类或MyClass本身。它是一个通配符?表示从number继承的任何类或Integer类的超类都可以工作。希

有人能解释一下为什么我们在
集合中使用
泛型吗

例如:

 List<? extends Number> numberlist;
 List<? super Integer> numberlist;

列表
在使用泛型时用于定义


示例中的语句告诉您,List接受任何类型的对象
Number

表示任何这样的类

? extends MyClass

是指MyClass的任何子类或MyClass本身。

它是一个通配符?表示从number继承的任何类或Integer类的超类都可以工作。希望这有帮助。:)

以下是我要说的:

List<? extends Number> numberlist; //Any class that is extended from Number class,  for example Integer, BigInt, ... may come

List<? super Integer> numberlist; //Any class that Integer class is extended from. Here for example Number may come

当您学习通配符和扩展超级之间的差异时,请记住。这条规则的全部内容都很容易记住

List通配符在如何使用集合方面引入了限制

例如,with
List
限制您调用将泛型类型作为参数的方法,并使所有返回泛型类型的方法返回
对象。这是因为我们根本不知道这是什么类型。例如,
列表中的所有这些分配都是合法的:

doSomethingWith(new ArrayList<Integer>());
doSomethingWith(new ArrayList<Double>());
List<?> list;
list = new ArrayList<Integer>();
list = new ArrayList<String>();
list = new ArrayList<MyClass>();
列表;
列表=新的ArrayList();
列表=新的ArrayList();
列表=新的ArrayList();

等等。

你更喜欢另一个角色?你是在问为什么我们使用这个特定的角色而不是另一个角色?我刚才已经问过类似的问题,请看。。。[1] :你的意思是不只是使用界面?回答得很好!非常感谢。
doSomethingWith(new ArrayList<Integer>());
doSomethingWith(new ArrayList<Double>());
// This will all compile
public void doSomethingWith(List<? extends Number> numbers) {
    for (Number number : numbers) {
        // Do something with number
    }
    // OR
    Number number = numbers.get(0);
    // OR
    Number number = numbers.remove(0);
}
public void doSomethingWith(List<? super Integer> integers) {
    integers.add(Integer.valueOf(0));
}
for (Object obj : integers)
// OR
Object obj = integers.get(0);
// OR
Object obj = integers.remove(0);
List<?> list;
list = new ArrayList<Integer>();
list = new ArrayList<String>();
list = new ArrayList<MyClass>();