2016-03-31 10 views
0

ich kommen ähnlich aussehende Beiträge über allgemeine Probleme gefunden haben, die nun aber nicht von ihnen mein Problem in einer Weise gefangen ich es verstehen konnte. Ich hoffe, dass mir jemand bei diesem Fall helfen kann.Java Generic Basis und Kindklasse „nicht anwendbar für die Argumente“

Ich habe versucht, viele Dinge, wie das Entfernen des „? Extends“ aus verschiedenen Orten und spielt mit? „Super“, um zu sehen, ob ein anderer Fehler mich in einer Richtung einer Lösung zeigen würde.

der folgende Code:

final ResponseBase response = executor.execute(myRequest); 

gibt mir den folgenden Compiler-Fehler: (? Capture # 6-of erstreckt RequestBase) „Verfahren auszuführen in der Art CommandExecutor für die Argumente nicht anwendbar ist (RequestBase) "

Der vollständige Code Eintrag:

public class MainClass { 

    private final static Map<Class<? extends RequestBase>, CommandExecutor<? extends RequestBase, ? extends ResponseBase>> MAP = new HashMap<>(); 

    public static void main(String[] args) { 

     final DummyCommandExecutor dummyCommandExecutor = new DummyCommandExecutor(); 
     MAP.put(MyRequest.class, dummyCommandExecutor); 

     final RequestBase myRequest = new MyRequest(); 
     myRequest.setRequestString("this is my request"); 

     final CommandExecutor<? extends RequestBase, ? extends ResponseBase> executor = MAP.get(myRequest.getClass()); 

     final ResponseBase response = executor.execute(myRequest); 

     System.out.println(response.getResponseString()); 
    } 
} 

interface CommandExecutor<T, R> { 

    R execute(T object); 

} 

class DummyCommandExecutor implements CommandExecutor<MyRequest, MyResponse> { 

    @Override 
    public MyResponse execute(MyRequest request) { 

     final MyResponse response = new MyResponse(); 
     response.setResponseString(request.getRequestString()); 

     return response; 
    } 

} 

class MyResponse extends ResponseBase { 

} 

class ResponseBase { 
    String responseString; 

    public String getResponseString() { 
     return this.responseString; 
    } 

    public void setResponseString(String responseString) { 
     this.responseString = responseString; 
    } 
} 

class MyRequest extends RequestBase { 

} 

class RequestBase { 
    String requestString; 

    public String getRequestString() { 
     return this.requestString; 
    } 

    public void setRequestString(String requestString) { 
     this.requestString = requestString; 
    } 

} 

Antwort

0

Sie können dies nicht tun, ohne zu werfen. Während Sie wissen, dass die Karte den richtigen Anweisungsausführer für einen bestimmten Typ zurückkehren wird, funktioniert der Compiler nicht, so müssen Sie den Compiler sagen, nicht zu kümmern:

final CommandExecutor<RequestBase,ResponseBase> executor = (CommandExecutor) MAP.get(myRequest.getClass()); 
+0

Danke, dass der Trick! Immer noch nicht sicher, warum der Compiler nicht weiß. Der Compiler sollte wissen, dass die HashMap einen Wert von "CommandExecutor" enthält? Erweitert RequestBase,? Erweitert ResponseBase> " – HaTo

+0

Das Problem ist'? 'Könnte jede Klasse sein, die' RequestBase' erweitert - der Compiler weiß nicht, dass der '? RequestBase' in der Tonart der Karte erstreckt, ist immer die gleiche, wie die '? erstreckt RequestBase' in der zurück CommandExecutor. –

0

Sie nicht nur mithalten können? mit T

eine Option ist nur zu tun:

final CommandExecutor executor = MAP.get(myRequest.getClass()); 

, in der Option natürlich können Sie Zeit Ausnahme, wenn die Karte kehrt nicht gießbaren fahren werden smth

Verwandte Themen