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?
Compile bien pour moi avec 1.8.0_65. Vous avez compilé avec quelle version de javac? –
Utilisé 1.8.0_45 et juste mis à jour à 1.8.0_65 mais toujours la même erreur. – ArcticLord
Juste pour être sûr, utilisez-vous Eclipse? –