【发布时间】:2014-07-17 15:20:26
【问题描述】:
我经常读到 Java 通配符是一个比使用站点变化的概念更强大的概念。但在我的理解中,Java 通配符的概念完全等同于使用站点差异的概念。
那么这两者有什么区别呢?您能否举一个具体的例子,可以使用 Java 通配符但不能使用站点差异?
例如,How does Java's use-site variance compare to C#'s declaration site variance? 中的第一个答案是我提出问题的一个示例:
首先,如果我没记错的话,使用站点的差异更严格 比声明站点差异更强大(尽管以 简洁),或者至少 Java 的通配符是 (实际上更多 比使用站点差异更强大)。
但是,答案并没有说明有什么区别,只是说有一个。
编辑:
我发现here(第 112 页上的第一段)的第一个区别似乎是使用站点差异完全不允许调用具有错误位置的类型参数的方法,而通配符允许使用某些类型调用它。例如,您不能在 List<? extends String> 上致电 add。使用 Java 通配符,您可以在这样的类上调用add,但您必须使用null 作为参数。对于逆变,一个可以调用任何返回的方法逆变参数,但必须假设返回类型为Object。但这是唯一的区别吗?
【问题讨论】:
-
这和这个问题有什么不同吗? stackoverflow.com/questions/4231305/…
-
@IsaiahvanderElst:不,您链接的问题是关于声明站点差异(例如,C# 的
out)与使用站点差异。我的问题是关于使用站点差异与通配符,这对我来说似乎完全相同。但是您链接的问题中的第一个答案至少说明了我的主张:“或者至少 Java 的通配符是(实际上比使用站点差异更强大)” -
@IsaiahvanderElst:我之前评论的第一句话措辞不正确。我想说的是“是的,这个问题与您链接的问题完全不同。”希望解释清楚。
-
@gexicide:看起来给出的示例答案有误。这个人可能是说:
...or at least Java's wildcards are (which are actually more powerful than declare-site variance).。 Java 通过通配符提供使用站点差异注释,所以我看不出一个应该比另一个更好。 -
@IsaiahvanderElst:我认为确实如此。这称为双变量。然而,在任何具有
Object类型(类型层次结构的根)的语言中,二元性等于covariance和Object。通配符也是如此,因为?等于? extends Object。
标签: java generics types type-systems type-theory