1

我有 2 节课如下。据我了解,编译器不能在第 4 行(类 WildCard)抱怨,因为我的参数化类型是(Node?super Number> 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
    }
}
4

2 回答 2

5

问题如下:

Node<? super Number>意味着您可以Node使用类型Number或超类型的参数传入任何参数,例如Object.

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

以下是为什么有些行编译而有些行不编译的简短细分:

  • s0.setData(object);不能编译,因为你可能有一个Node<Number>which 不会你添加任意对象
  • s0.setData(number);编译因为Number匹配参数的所有可能类型
  • s0.setData(integer);编译因为Integerextends Number,因此上面的行适用

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

  • number=s0.getData();无法编译,因为您可能有 a Node<Object>,因此数据对象可能有不同的类型(例如String
  • integer=s0.getData(); 无法编译,原因与上一行相同
于 2012-05-09T16:38:24.867 回答
0

Java 语言规范说:

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

? extends B

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

? super B

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

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

于 2012-05-09T16:23:44.557 回答