【发布时间】:2015-03-14 02:04:03
【问题描述】:
在Java中,它说:
String[] is subtype of Object[]
所以说数组是协变的。但是对于泛型,他们说:
List<X> will not be subType of List<Y>.
因此它是不变的。但问题是,“泛型真的是不变的”吗?
例如,如果我给:
List<? extends Exception>
这意味着该列表可以采用Exception 的子类型,例如这是有效的:
List<? extends Exception> k = new ArrayList<NumberFormatException>();
那为什么说泛型是不变的呢?
【问题讨论】:
-
也许,因为 String 实际上是 Object 的子类型,但 X 可能是也可能不是 Y 的子类型,因为它是通用的......只是猜测
-
我的评论是对您问题的回答,而不是对
why a close vote?:) -
我在犹豫是否称其为重复,但我认为this question 和已接受答案中链接的 Java 教程很好地解释了这个问题。我认为造成混淆的主要原因是通配符限制了容器的类型,而不是容器元素的类型。
-
投票关闭的人不清楚您的要求不了解协变、不变和泛型,因此与其投票关闭,他们应该阅读这些主题并保持问题开放以供学习东西。
-
@LuiggiMendoza 请不要对人们的动机和理解做出假设。我是投票关闭为不清楚的人,并且(1)这个问题的原始版本以一个不完整的句子结尾,当时它没有被编辑; (2) 这个问题起初在我看来是要我们读懂别人的想法——即为什么人们称泛型为“不变的”,而它们的一种风格不是?所以也许我太快了,但你太快了,无法对“为什么”做出一些相当不准确的假设。