2015-11-05 10 views
9

Tak, mam następujący kod:Wnioskowany problem typu Java 1.8.0_65

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); 
    } 
} 

Gdybym to skompilować z javac v1.8.0_05, to działa prawidłowo. Pod 1.8.0_65, pojawia się następujący błąd (jak donosi z -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 

ten znika, jeśli jawnie rzutować null argument Double lub jeśli usunąć Object[] przeciążenie doAssert.

A więc ... czy jest to regresja w wersji 1.8.0_65 lub jednej z innych interweniujących wersji, czy też 1.8.0_05 był nadmiernie permisywny? I dlaczego javac nie może zrozumieć, co ma robić?

(ponownie: głosowanie przybliżone - dla mnie nie jest oczywiste, jak drugi Q & A jest duplikatem, a powiązane pytania nie wydają się zajmować problemem przeciążenia metody, który jest wymagany do odtworzenia tego problemu.)

+1

Powtórzyłem ten błąd z 1.8.0_60 (uwaga: Eclipse Mars 4.5.1 kompiluje to dobrze). IMO to powinno się skompilować dobrze. – Tunaki

+0

Możliwy duplikat [Czy istnieje regresja wnioskowania typu w aktualizacji JDK 8 20?] (Http://stackoverflow.com/questions/25490581/is-there-a-type-inference-regression-in-jdk-8-update -20) –

+1

dobrze - czy powinien się skompilować? rozdzielczość przeciążania zależy od typów argumentów; jednak tutaj typy argumentów muszą być wywnioskowane z typów parametrów, co wymaga wcześniejszego rozwiązania problemu przeciążenia ... nie jest to banalny problem. Powodzenia w czytaniu specyfikacji - pisarze kompilacji zrobili :) – ZhongYu

Odpowiedz

1

W aktualizacji 20 changelog jedną z cech dodany był:

Java Compiler aktualizowane

Widać ilość błędów związanych z javac i parametry wnioskowania tutaj: http://www.oracle.com/technetwork/java/javase/2col/8u20-bugfixes-2257730.html

W niektórych błędach (f.e: http://bugs.java.com/view_bug.do?bug_id=8046762) niektóre nowe dodatki zostały cofnięte. Być może może to być przyczyną zachowania javac w aktualizacji 65 i wyjaśnić, że działa również w aktualizacji 5.