2017-08-25 1 views
2

Ich versuche, mit Java8 Methodenreferenzen zu behandeln und stieß auf sehr seltsame Kompilierungsfehler.Java8 Method Reference und Generics, Typ Cast in einigen Fällen erforderlich

Ich hatte eine Karte mit Objektwerten und ich möchte für den Benutzer einige Funktionen auf Werte anwenden.

So habe ich generische Methode, die Mapkey und funktionale Schnittstelle als Parameter

Und ich, warum ich Referenzmethode brauchen nicht frage mich braucht, um präzise Echt Art zu werfen (bei trim)

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

Ergebnis:

{key1 = etwas Text mit Platz in Start, key2 = AAAAAAAAAAAAAA} {key1 = some Text wi ten Platz in Start, key2 = AAAAAAAAAAAAAA}

+5

Sie vergessen zu erwähnen, welche kompilieren Fehler Sie genau einsehen. Es könnte damit zu tun haben, dass toLowerCase zwei Überladungen hat, aber ohne den Fehler können wir nicht sagen. Bitte [bearbeiten] Sie Ihre Frage und fügen Sie sie hinzu. – RealSkeptic

+0

Hinzugefügt in Code. Es scheint für mich seltsam, warum es Methode nach dem Gießen auflösen könnte, wenn es 2 von ihnen gibt – Limmy

+1

Dieser Kompilierungsfehler macht es klingt wie @ RealSkeptic Theorie über Überladungen ist wahrscheinlich richtig: https://ideone.com/I1Y7Am – Radiodef

Antwort

1

Die Antwort bereits in den Kommentaren auf die Frage gegeben wurde - ja, das Problem ist, dass Java die Methode von String nicht entscheiden kann, Klasse verwendet werden soll (es gibt zwei - eine mit no-arg und zweite mit Locale).

Dies hängt auch mit dem Ableiten der Argumente des Methodentyps zusammen. Im Kontext des bereitgestellten Codes kann JRE dies nicht tun. auch

Siehe:

Verwandte Themen