所以,我有以下代码:
public class Tester {
public static void doAssert(Object foo, Object bar) {
}
public static void doAssert(Object[] foo, Object[] bar) {
}
public static <T> T getValue(String name, Function<String, T> covert) {
return null;
}
public static void main (String[] args) {
doAssert(getValue("", Double::valueOf), null);
}
}
如果我用javac v1.8.0_05编译它,这很好用。在1.8.0_65下,我收到以下错误(与-Xdiags:verbose
一起报告):
Tester.java:32: error: method doAssert in class Tester cannot be applied to given types;
doAssert(null, getValue("", Double::valueOf));
^
required: Object[],Object[]
found: <null>,Double
reason: argument mismatch; inferred type does not conform to upper bound(s)
inferred: Double
upper bound(s): Object[],Object
1 error
如果我明确地将null
参数转换为Double
,或者删除了Object[]
的{{1}}重载,则会消失。
所以...这是1.8.0_65或其他干预版本之一的回归,还是1.8.0_05过度宽松?为什么javac能够弄清楚它应该做什么?
(回复:关闭投票 - 对我而言,其他Q&amp; A如何重复是不明显的;链接的问题似乎不会解决方法重载问题,这是必需的重现这个问题。)