2017-08-25 4 views
2

J'essaie de traiter les références de méthode Java8 et j'ai rencontré une erreur de compilation très étrange.Java8 Méthode Référence et génériques, cast de type requis dans certains cas

J'ai eu une carte avec des valeurs d'objet et je veux permettre à l'utilisateur d'appliquer certaines fonctions sur les valeurs.

J'utilise la méthode générique qui prend la clé de carte et une interface fonctionnelle en tant que paramètre

Et je me demande pourquoi je ne ai pas besoin de jeter référence Méthode type réel précis (en cas de garniture)

import java.util.HashMap; 
import java.util.Map; 
import java.util.function.UnaryOperator; 

public class ReferenceDiscovering { 

    Map<String, Object> values = new HashMap<>(); 

    public static void main(String[] args) { 
     ReferenceDiscovering main = new ReferenceDiscovering(); 
     main.values.put("key1", " some text with space in start"); 
     main.values.put("key2", "AAAAAAAAAAAAAA"); 

     System.out.println(main.values); 

     main.applyFunctionByKey("key1", String::trim); 
     //  cannot resolve method toLowerCase 
     //  COMPILE ERROR HERE. WHY???? WHY NOT FOR trim? 
     //  main.applyFunctionByKey("key2", String::toLowerCase); 
     main.applyFunctionByKey("key2", (UnaryOperator<String>)String::toLowerCase); 


     System.out.println(main.values); 
    } 

    private <T> void applyFunctionByKey(String key, UnaryOperator<T> binaryOperator) { 
     if (values.containsKey(key)) { 
      values.put(key, binaryOperator.apply((T)values.get(key))); 
     } 
    } 
} 

Résultat:

{key1 = texte avec l'espace en début, key2 = aaaaaaaaaaaaaa} {key1 = un peu texte wi e espace début, key2 = aaaaaaaaaaaaaa}

+5

Vous avez oublié de mentionner que vous avez erreur de compilation exactement. Cela pourrait avoir à voir avec le fait que 'toLowerCase' a deux surcharges, mais nous ne pouvons pas le dire sans l'erreur. S'il vous plaît [modifier] votre question et l'inclure. – RealSkeptic

+0

Ajouté en code. Cela semble étrange pour moi pourquoi il pourrait résoudre la méthode après le lancement s'il y en a 2 – Limmy

+1

Cette erreur de compilation donne l'impression que la théorie de @ RealSkeptic sur les surcharges est probablement correcte: https://ideone.com/I1Y7Am – Radiodef

Répondre

1

La réponse a déjà été donnée dans les commentaires à la question - oui, le problème est que Java ne peut pas décider quelle classe méthode de chaîne doit être utilisé (il y en a deux - un avec no-arg et second avec Locale).

Ceci est également lié à la déduction des arguments de type méthode. Dans le contexte du code fourni, JRE ne peut pas le faire.

Voir aussi: