为什么字符串& Integer不是Object的超类?对象类是否真的是一个下界?
List<? super Object> mylist = new ArrayList<Object>();
mylist.add("Java"); // no compile error
mylist.add(2);
我知道,wild card guidelines使用下界通配符和超强的“出”变量,但似乎对象不作为在这种情况下,一个“下限”。
此外,这是允许将任何类型添加到列表中的唯一方法吗?
为什么字符串& Integer不是Object的超类?对象类是否真的是一个下界?
List<? super Object> mylist = new ArrayList<Object>();
mylist.add("Java"); // no compile error
mylist.add(2);
我知道,wild card guidelines使用下界通配符和超强的“出”变量,但似乎对象不作为在这种情况下,一个“下限”。
此外,这是允许将任何类型添加到列表中的唯一方法吗?
这很简单。请记住,在Java中,子类型的实例也是其超类型的实例。
看的add
public boolean add(E e)
签名这意味着无论你通过什么类型为E
或E
任何亚型。
您有List<? super Object>
。因此,您可以传递myList.add()
任何类型为? super Object
(未知类型可能是Object
或其超类型)或其任何子类型的任何类型。
是整数是? super Object
包含的所有类型的子类型?当然。 Integer
是Object
的子类型,它是由? super Object
包含的所有类型的子类型(当然,在这种情况下,只有Object
满足此条件)。
您将类型参数与可传递给方法的内容混淆在一起。 类型参数的List<? super Object>
是一个超类型Object
的未知类型,所以Integer
或String
不能是实际的类型参数。实际上,在这种情况下,唯一有效的实际类型参数是Object
。但是当你将某些东西传递给方法时,你问的是我传递子类型的东西吗?答案是肯定的。
这是因为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
超类。
我同意这很让人困惑,但是这里发生了什么。
在这行代码:
List<? super Object> mylist...
你是说myList
是List
,其中每个元素可以是一个类型,它是Object
或Object
超类的。但是,您只在此处声明myList
的类型。
通配符的作用是限制您的实现myList
。
然后,你这样做:
List<? super Object> mylist = new ArrayList<Object>();
现在你正在做的是实例化一个ArrayList<Object>
。您的下界通配符用于检查这是否有效。这是有效的,因为Object
匹配? super Object
。在这一点上,你有一个List<Object>
,你的方法调用是允许的。
http://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html声明“下界限通配符将未知类型限制为该类型的特定类型或超类型” – Sridhar 2012-08-10 18:16:16
它也是指出:“使用通配符('?')来表示下界有界的通配符,紧随其后的是super关键字,后面是下界: super A>。”在这里,A是Object,但我同意将A调用为下限,实际上,超类可能会引起误解。 – Gamb 2012-08-10 18:19:51
我不同意我不正确地解释泛型关系。你对@Dancrumb提供的答案有什么要说的? – Sridhar 2012-08-10 18:29:59