JDK是正确的。第二种方法没有比第一种更具体。从JLS3#15.12.2.5
“非正式的直觉是,如果第一种方法处理的任何调用都可以传递给另一个方法而没有编译时类型错误,则一个方法比另一个方法更具体。”
这里显然不是这种情况。我强调了任何调用。一种方法比另一种方法更具体的属性纯粹取决于两种方法本身。每次调用都不会改变。
正式分析您的问题:m2比m1更具体吗?
m1: void setValue(Parameter parameter, R value)
m2: void setValue(Parameter parameter, Field value)
首先,编译器需要根据初始约束来推断R:
Parameter <
Field <
根据R=V15.12.2.7中的推理规则,结果为
现在我们替换R并检查子类型关系
Parameter <:>
Field <:>
根据4.10.2中的子键入规则,第二行不成立。因此,m2比m1更具体。
V不在Object此分析中;分析考虑了的所有可能值V。
我建议使用不同的方法名称。绝对不需要过载。
这似乎是Eclipse中的重要错误。规范非常清楚地表明在此步骤中未替换类型变量。Eclipse显然首先进行类型变量替换,然后检查方法特异性关系。
如果在某些示例中这种行为更“明智”,则在其他示例中则不是。说,
m1: void check(List list, T obj) { print("1"); }
m2: void check(List list,
本文发布于:2024-02-03 04:53:42,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170690722248775.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |