Java 1.8.0_65的推断类型问题

Sbo*_*odd 9 java generics type-inference java-8

所以,我有以下代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我用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
Run Code Online (Sandbox Code Playgroud)

如果我明确地转换null参数Double,或者如果我删除了Object[]重载,这就消失了doAssert.

所以...这是1.8.0_65或其他一个干预版本中的回归,还是1.8.0_05过度宽松?为什么javac不能弄清楚它应该做什么?

(回复:关闭投票 - 对我而言,其他问答是如何重复的并不明显;链接的问题似乎不会解决方法重载问题,这是重现此问题所必需的.)

Fra*_*dez 1

在 update 20 变更日志中添加的功能之一是:

Java 编译器已更新

您可以在此处查看与 javac 和参数推断相关的错误数量: http: //www.oracle.com/technetwork/java/javase/2col/8u20-bugfixes-2257730.html

在一些错误中(例如: http: //bugs.java.com/view_bug.do? bug_id=8046762),一些新添加的内容被恢复。也许这可能是更新 65 中 javac 行为的原因,并解释它在更新 5 中也能工作。