我理解PECS (生产者扩展,消费者超级)的概念,但对这些符号仍有混淆:
public class PECSTest {
public static void main(String[] args) {
//List<? extends Object> ProducerList = new ArrayList<String>();
//ProducerList.add("1"); // Line 1 :compileTimeError
PECSTest myTest = new PECSTest();
List<String> myList = new ArrayList<String>();
myList.add("abc");
myTest.printMyList(myList);
}
private void printMyList(List<? extends Object> myList) {
// TODO Auto-generated method stub
int i=0;
while(i<myList.size()) {
System.out.println(myList.get(i).getClass()); //Line 2
System.out.println(myList.get(i).charAt(0)); // Line 3
System.out.println(myList.get(i).equals(new String("abc")));
i++;
}
}
}也适用于消费者
List<? super Number> myList = new ArrayList<Object>();
myList.add(new Object());// compile time error为什么我不能在myList中添加对象。因为如果我们使用的是超级,这意味着这个列表可以包含在Java类的继承结构中等于和高于数字的对象。因此,新对象()应该按照该语句添加到列表中。
谢谢。
发布于 2019-11-25 11:32:30
List已经是泛型了,所以您不应该将其类型设置为泛型;如果您希望它接受所有类型,将其类型设置为Object;此外,您也不应该在实例化中指定类型,因为Java可以从类型声明中推断它:
List<Object> ProducerList = new ArrayList<>();多亏了多态,ProducerList现在允许所有类型,因为所有类都是Object类的专门化。
由于printMyList的参数myList接受更多的这一类型,所以必须在转换它之前检查它的类型,以便调用它的方法,例如charAt() for String。
if (myList.get(i) instanceof String) {
System.out.println(((String)myList.get(i)).charAt(0)); // Line 3
}完整的工作代码:
import java.util.*;
class PECSTest
{
public static void main(String[] args) {
List<Object> ProducerList = new ArrayList<>();
ProducerList.add("1"); // Line 1
PECSTest myTest = new PECSTest();
List<String> myList = new ArrayList<String>();
myList.add("abc");
myTest.printMyList(myList);
}
private void printMyList(List<? extends Object> myList) {
int i=0;
while(i<myList.size()) {
System.out.println(myList.get(i).getClass()); //Line 2
if (myList.get(i) instanceof String) {
System.out.println(((String)myList.get(i)).charAt(0)); // Line 3
}
System.out.println(myList.get(i).equals(new String("abc")));
i++;
}
}
}产出:
class java.lang.String
a
true附带注意:为什么在Number (List<? super Number>)上使用较低的有界通配符?可能是List<? extends Number>允许Number的每个子类,而不是一个Number.
https://stackoverflow.com/questions/59030590
复制相似问题