关于java:Object类真的可以下限吗?

Can the Object class really be a lower bound?

当字符串和整数不是对象的超级类时,为什么以下内容合法?

1
2
3
List<? super Object> mylist = new ArrayList<Object>();
mylist.add("Java"); // no compile error
mylist.add(2);

我知道通配符准则使用下界通配符,super用于"out"变量,但在这种情况下,对象似乎不起"下界"的作用。

这也是允许向列表中添加任何类型的唯一方法吗?


这真的很简单。请记住,在Java中,子类型的实例也是其超类型的实例。

看看EDOCX1的签名(23)

1
public boolean add(E e)

这意味着无论你传递什么,它的类型是EE的任何子类型。

你有一个List。所以你可以把任何类型为? super Object的东西(一个未知的类型,可以是Object或它的超类型)或它的任何子类型传给myList.add()

integer是? super Object所包含的所有类型的子类型吗?当然。IntegerObject的一个亚型,是? super Object所包含的所有类型的一个亚型(当然,在这种情况下,只有Object满足这一点)。

您将类型参数与可以传递给方法的内容混淆在一起。List的类型参数是一个未知的类型,它是Object的父类型,因此IntegerString不能是实际的类型参数。实际上,在这种情况下,唯一有效的实际类型参数是Object。但是当你将某个东西传递给方法时,你会问,我传递的是子类型吗?答案是肯定的。


我同意这是令人困惑的,但这里是正在发生的事情。

在这行代码中:

1
List<? super Object> mylist...

你是说myListList,其中每个元素都可以是ObjectObject的超类。但是,这里只声明myList的类型。

通配符的作用是限制myList的实现。

然后,您可以这样做:

1
List<? super Object> mylist = new ArrayList<Object>();

现在你要做的是实例化一个ArrayList。下界通配符用于检查这是否有效。它是有效的,因为Object? super Object匹配。此时,您有一个List,并且您随后的方法调用是允许的。