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通配符在如何使用集合方面引入了限制
例如,withList
限制您调用将泛型类型作为参数的方法,并使所有返回泛型类型的方法返回对象。这是因为我们根本不知道这是什么类型。例如,列表中的所有这些分配都是合法的:
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>();