gpt4 book ai didi

java - 泛型:LowerBounded 通配符与 UpperBounded 通配符

转载 作者:行者123 更新时间:2023-12-01 19:57:13 24 4
gpt4 key购买 nike

我理解 PECS(生产者扩展,消费者 super )的概念,但对这些符号仍然感到困惑:

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++;
}
}
}
  • 即使我创建了一个可以接受任何扩展 Object 类的对象的列表,但当我尝试添加字符串时,它在第 1 行给出了编译时错误。为什么会这样?
  • 在第二种情况下,当我将列表传递给 printMyList 方法时,它会在第 2 行打印 String 中的每个元素类类型,但在第 3 行为什么我无法调用任何 String 类特定方法,例如 charAt 。另外为什么不需要对 String 进行转换。

对于消费者也是如此

 List<? super Number> myList = new ArrayList<Object>();
myList.add(new Object());// compile time error

为什么我无法在 myList 中添加对象。因为如果我们使用 super ,则意味着该列表可以包含等于或大于 Java 类层次结构中的 number 的对象。因此 new Object() 应该按照该语句添加到列表中。

谢谢。

最佳答案

List已经是泛型,因此您不应将其类型设置为泛型;如果您希望它接受所有类型,请将其类型设置为 Object ;另外,您不应该在实例化中指定类型,因为 Java 可以从类型声明中推断出它:

List<Object> ProducerList = new ArrayList<>();

感谢 Java Polymorphism , ProducerList现在允许所有类型,因为所有类都是 Object 的特化类。

printMyList的参数myList接受不止一种类型,您必须在强制转换之前检查其传递的类型,以便调用其方法,例如charAt()对于 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 的每个子类相反,每个 Object那不是Number ...

关于java - 泛型:LowerBounded 通配符与 UpperBounded 通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59030590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com