2012-08-10 61 views
4

为什么字符串& Integer不是Object的超类?对象类是否真的是一个下界?

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

我知道,wild card guidelines使用下界通配符和超强的“出”变量,但似乎对象不作为在这种情况下,一个“下限”。

此外,这是允许将任何类型添加到列表中的唯一方法吗?

回答

4

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

看的add

public boolean add(E e) 

签名这意味着无论你通过什么类型为EE任何亚型。

您有List<? super Object>。因此,您可以传递myList.add()任何类型为? super Object(未知类型可能是Object或其超类型)或其任何子类型的任何类型。

是整数是? super Object包含的所有类型的子类型?当然。 IntegerObject的子类型,它是由? super Object包含的所有类型的子类型(当然,在这种情况下,只有Object满足此条件)。

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

3

这是因为Object是Integer和String的超类。你用另一种方式来解释泛型关系。

编辑

想想这种情况:

List<? extends myClass> listOfMyClass = new ArrayList<Object>(); 

在这种情况下,你会拥有的Object类型元素的列表但必须尊重该声明所添加的限制的listOfMyClass列表。

您可以将属于myClass层次结构的任何对象添加到列表中。正在实现List接口的ArrayList将在请求时保存(并返回)Object类型元素。

当然,你可以定义这样的:

List<? extends myClass> listOfMyClass = new ArrayList<mySuperClass>(); 

正如你可能现在的ArrayList必须包含一个具有相同类型或myClass的超类型,在这种情况下的对象,那就是mySuperClass。此列表将返回mySuperClass qhen请求的对象。

ClassX为不属于mySuperClass分级中的类,下面的行不会编译:

List<? extends myClass> listOfMyClass = new ArrayList<ClassX>(); 

这是因为ClassX不是myClass超类。

+0

http://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html声明“下界限通配符将未知类型限制为该类型的特定类型或超类型” – Sridhar 2012-08-10 18:16:16

+0

它也是指出:“使用通配符('?')来表示下界有界的通配符,紧随其后的是super关键字,后面是下界:。”在这里,A是Object,但我同意将A调用为下限,实际上,超类可能会引起误解。 – Gamb 2012-08-10 18:19:51

+0

我不同意我不正确地解释泛型关系。你对@Dancrumb提供的答案有什么要说的? – Sridhar 2012-08-10 18:29:59

3

我同意这很让人困惑,但是这里发生了什么。

在这行代码:

List<? super Object> mylist... 

你是说myListList,其中每个元素可以是一个类型,它是ObjectObject超类的。但是,您只在此处声明myList的类型。

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

然后,你这样做:

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

现在你正在做的是实例化一个ArrayList<Object>。您的下界通配符用于检查这是否有效。这是有效的,因为Object匹配? super Object。在这一点上,你有一个List<Object>,你的方法调用是允许的。

+0

'新ArrayList '部分与这个问题真的没有任何关系。同样的问题可以用'List <?超级对象> mylist = null;' – newacct 2012-08-10 18:40:55

+1

如何添加到列表而无需初始化? – Sridhar 2012-08-10 18:55:56

+0

我想重点是'对象'是唯一匹配通配符'<?'的类。超级对象>' – Dancrumb 2012-08-10 19:16:14

相关问题