关于通配符参数化类型的混淆

时间:2012-05-09 16:05:06

标签: java generics

我有两个课程如下。根据我的理解,编译器不能在第4行(类WildCard)抱怨,因为我的参数化类型是(节点?超级数> s0),因为对象在参数化类型中是超级数。但是编译器在4,8和9处抱怨。为什么这样。

public class Node<E> {

    private E data;

    public void setData(E obj) {
        data = obj;
    }

    public E getData() {
        return data;
    }
}


public class WildCard {


    static void checkIt(Node<? super Number> s0)
    {
        Object object=new Object(); //1
        Number number =1.5; //2
        Integer integer=10; //3

        s0.setData(object); //4
        s0.setData(number); //5
        s0.setData(integer); //6

        object=s0.getData(); //7
        number=s0.getData(); //8
        integer=s0.getData(); //9
    }
}

2 个答案:

答案 0 :(得分:5)

问题如下:

Node<? super Number>表示您可以使用Node类型的参数或超类型传递任何Number,例如Object

由于您不知道该通用参数的确切类型,因此不允许执行某些操作。

这里有一些简短的细分为什么有些行编译而有些则没有:

  • s0.setData(object);无法编译,因为您可能有一个Node<Number>并不是所有人都可以添加任意对象
  • s0.setData(number);编译,因为Number匹配参数的所有可能类型
  • s0.setData(integer);编译,因为Integer扩展了Number,因此适用上述行

  • object=s0.getData();编译因为任何数据对象都延伸Object,总是

  • number=s0.getData();无法编译,因为您可以拥有Node<Object>,因此数据对象可能具有不同的类型(例如String
  • integer=s0.getData();无法编译,原因与
  • 相同

答案 1 :(得分:0)

Java语言规范说:

  

可以为通配符提供明确的界限,就像常规类型一样   变量声明。上限表示如下   语法,其中B是绑定的:

     

? extends B

     

与方法签名中声明的普通类型变量不同,没有类型   使用通配符时需要推断。因此,它是   允许在通配符上声明下限,使用以下内容   语法,其中B是下限:

     

? super B

Reference(T referent, ReferenceQueue<? super T> queue);

这里,可以将引用对象插入到元素类型为超类型的任何队列中 输入引用的T; T是通配符的下限。