首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型: LowerBounded通配符与UpperBounded通配符

泛型: LowerBounded通配符与UpperBounded通配符
EN

Stack Overflow用户
提问于 2019-11-25 11:19:30
回答 1查看 58关注 0票数 0

我理解PECS (生产者扩展,消费者超级)的概念,但对这些符号仍有混淆:

代码语言:javascript
复制
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++;
        }
    }
}
  • 甚至我也创建了一个列表,它可以接受任何扩展对象类的对象,但是当我尝试添加字符串时,它在第1行出现了编译时错误。
  • 在第二种情况下,当我将列表传递给printMyList方法时,它会在第2行以字符串形式打印每个元素类类型,但在第3行打印为什么不能调用任何特定于字符串类的方法,如charAt。也是为什么不需要转换字符串。

也适用于消费者

代码语言:javascript
复制
 List<? super Number> myList = new ArrayList<Object>();
 myList.add(new Object());// compile time error

为什么我不能在myList中添加对象。因为如果我们使用的是超级,这意味着这个列表可以包含在Java类的继承结构中等于和高于数字的对象。因此,新对象()应该按照该语句添加到列表中。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-11-25 11:32:30

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

代码语言:javascript
复制
List<Object> ProducerList = new ArrayList<>();

多亏了多态ProducerList现在允许所有类型,因为所有类都是Object类的专门化。

由于printMyList的参数myList接受更多的这一类型,所以必须在转换它之前检查它的类型,以便调用它的方法,例如charAt() for String

代码语言:javascript
复制
if (myList.get(i) instanceof String) { 
    System.out.println(((String)myList.get(i)).charAt(0)); // Line 3
}

完整的工作代码:

代码语言:javascript
复制
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++;
        }
    }
}

产出:

代码语言:javascript
复制
class java.lang.String
a
true

附带注意:为什么在Number (List<? super Number>)上使用较低的有界通配符?可能是List<? extends Number>允许Number的每个子类,而不是一个Number.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59030590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档