当 String 和 Integer 不是 Object 的父类(super class)时,为什么以下是合法的?
List<? super Object> mylist = new ArrayList<Object>();
mylist.add("Java"); // no compile error
mylist.add(2);
我知道 wild card guidelines对“out”变量使用下界通配符和 super,但在这种情况下,Object 似乎不能用作“下界”。
这也是允许将任何类型添加到列表中的唯一方法吗?
最佳答案
其实很简单。请记住,在 Java 中,子类型的实例也是其父类(super class)型的实例。
看add
的签名
public boolean add(E e)
这意味着无论你传递什么类型为 E
的东西或 E
的任何子类型.
你有一个 List<? super Object>
.所以你可以传递给myList.add()
任何类型为 ? super Object
的东西(未知类型,可能是 Object
或其父类(super class)型)或其任何子类型。
Integer 是? super Object
包含的所有类型的子类型吗? ?当然。 Integer
是 Object
的子类型,它是 ? super Object
包含的所有类型的子类型(当然,在这种情况下,只有 Object
满足这个)。
您将类型参数与可以传递给方法的内容混淆了。 List<? super Object>
的类型参数是未知类型,是 Object
的父类(super class)型, 所以 Integer
或 String
不能是实际的类型参数。事实上,在这种情况下,唯一有效的实际类型参数是 Object
。 .但是,当您将某些东西传递给方法时,您要问的是,我传递的东西是子类型吗?答案是肯定的。
关于java - Object 类真的可以是下界吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11906955/