0

J'ai une classe très complexe qui obtient une valeur générique, une interface fonctionnelle et certaines sous-classes génériques typées. Maintenant, j'ai remarqué un comportement étrange lié à l'inférence de type. Jetez un oeil à ce code:comportement d'inférence de type étrange

public class Test{ 
    public static class SubClass<F>{ 
     public SubClass(){} 
    } 

    @FunctionalInterface 
    public interface FuncInterface { 
     void operation(String s); 
    } 

    @SafeVarargs 
    public <T> Test(T obj, FuncInterface fi, SubClass<T>...sc){} 

    @SafeVarargs 
    public <T> Test(T obj, SubClass<T>...sc){} 

    public static void main(String[] args){ 
     Test t = new Test(
        42, 
        (s)->{}, 
        new SubClass<>()); 
    } 
} 

La ligne Test t = new Test (...); ne peut pas compiler en raison d'erreur suivant:

The constructor Test(int, (<no type> s) -> {}, new SubClass<>()) is undefined 

Maintenant, je trouve deux possibilités pour obtenir ce travail de code:
1) Définir le type explicite pour le paramètre d'interface fonctionnelle

Test t = new Test(
    42, 
    (String s)->{}, 
    new SubClass<>()); 

2) ou supprimer la constructeur surchargé. Je n'ai vraiment pas le problème du compilateur ici et pourquoi mes solutions fonctionnent. Quelqu'un peut-il expliquer ce qui se passe ici?

+0

Compile bien pour moi avec 1.8.0_65. Vous avez compilé avec quelle version de javac? –

+0

Utilisé 1.8.0_45 et juste mis à jour à 1.8.0_65 mais toujours la même erreur. – ArcticLord

+0

Juste pour être sûr, utilisez-vous Eclipse? –

Répondre

0

C'est certainement un problème de compilateur Eclipse pour Java (ECJ) qui est utilisé par Eclipse en interne. Pour ajouter autour de ce type d'argument à la lambda:

public static void main(String[] args){ 
    Test t = new Test(
       42, 
       (String s)->{}, 
       new SubClass<>()); 
} 

De cette façon, il compile bien (au moins dans Eclipse Luna 4.4.2).

+0

Fonctionne avec IntelliJ et la ligne de commande. Corriger Java. Mauvaise mauvaise éclipse. Merci pour l'aide – ArcticLord