java - Object 类真的可以是下界吗?

标签 java generics

当 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 包含的所有类型的子类型吗? ?当然。 IntegerObject 的子类型,它是 ? super Object 包含的所有类型的子类型(当然,在这种情况下,只有 Object 满足这个)。

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

关于java - Object 类真的可以是下界吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11906955/

相关文章:

generics - 参数化类型的特定生成器

java - 使用无限通配符会捕获错误的情况,但只有在使用原始类型时才会被标记为警告

c# - 从另一个泛型方法调用一个 MaybeNull 泛型方法

java - netbeans 复制的表单无效

c# - 在 .NET 中对类型参数进行约束有什么意义(基类和接口(interface)约束)

c# - 队列 <byte> 与流

java - 在java正则表达式中获取组名

java - 从禁用的 JTextField 复制文本

java - Android:是否可以在另一个手指已经触摸屏幕时处理点击?

java - 使用 Spring Bean 连接数据库对象