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)
。
这意味着无论你传递什么,它的类型是E 或E 的任何子类型。
你有一个List super Object> 。所以你可以把任何类型为? super Object 的东西(一个未知的类型,可以是Object 或它的超类型)或它的任何子类型传给myList.add() 。
integer是? super Object 所包含的所有类型的子类型吗?当然。Integer 是Object 的一个亚型,是? super Object 所包含的所有类型的一个亚型(当然,在这种情况下,只有Object 满足这一点)。
您将类型参数与可以传递给方法的内容混淆在一起。List super Object> 的类型参数是一个未知的类型,它是Object 的父类型,因此Integer 或String 不能是实际的类型参数。实际上,在这种情况下,唯一有效的实际类型参数是Object 。但是当你将某个东西传递给方法时,你会问,我传递的是子类型吗?答案是肯定的。
我同意这是令人困惑的,但这里是正在发生的事情。
在这行代码中:
1
List<? super Object> mylist...
。
你是说myList 是List ,其中每个元素都可以是Object 或Object 的超类。但是,这里只声明myList 的类型。
通配符的作用是限制myList 的实现。
然后,您可以这样做:
1
List<? super Object> mylist = new ArrayList< Object> ( ) ;
现在你要做的是实例化一个ArrayList 。下界通配符用于检查这是否有效。它是有效的,因为Object 与? super Object 匹配。此时,您有一个List ,并且您随后的方法调用是允许的。
安切洛蒂的new ArrayList 部分没有做真的有问题。同样的问题可以在一个List super Object> mylist = null;
你如何添加一个列表initialising没有?
我想这一点Object 类是唯一匹配的通配符 super Object>
这是因为对象是整数和字符串的超类。你在用另一种方式解释一般的关系。
编辑
想想这种情况:
1
List<? extends myClass> listOfMyClass = new ArrayList< Object> ( ) ;
在这种情况下,您将得到一个Object 类型元素的列表,但必须遵守listOfMyClass 列表声明中添加的限制。
您可以将属于myClass 层次结构的任何对象添加到列表中。执行List 接口的ArrayList 将在需要时保存(并返回)Object 类型元素。
当然,您可以定义:
1
List<? extends myClass> listOfMyClass = new ArrayList< mySuperClass> ( ) ;
号
正如您现在可能看到的,ArrayList 必须包含具有相同类型或超类型myClass 的对象,在这种情况下,这就是mySuperClass 。此列表将返回要求QHEN的mySuperClass 个对象。
将ClassX 作为一个不属于mysuperclass层次结构的类,将不会编译以下行:
1
List<? extends myClass> listOfMyClass = new ArrayList< ClassX> ( ) ;
这是因为ClassX 不是myClass 的超类。
docs.oracle.com JavaSE教程/ / / / / Java的泛型zwnj lowerbounded.h &;& #所8203;美国"下有界通配符restricts不为人知的类型或一个特定类型的超类型是类型"
它是"美国下有界通配符通配符字符使用的是表达(?)以下由超级关键字,他们的结合,通过其下:<?超级a >"。在这里,但我同意这是一个对象时,它会调用A的下一个父类,事实上,对于成本,可以实现的。
我不同意,我的关系,解释。你要说是"dancrumb提供的答案吗?
它是一个有效的答案,我说的是什么线。他想保持对象的列表中,你要确保和通配符是subclasses这些对象的对象。subclasses字符串和整数是两个对象。我会编辑我的答案一个example of another case。
"sridhara那里,我编辑我的答案。希望它帮助和澄清。