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;
}
}
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
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. –