Meine Frage ist nicht einfach mit Worten zu erklären, glücklicherweise ist es nicht zu schwierig zu demonstrieren. Also, mit mir tragen:Wie Generika und Vererbung richtig mischen, um das gewünschte Ergebnis zu erhalten?
public interface Command<R>
{
public R execute();//parameter R is the type of object that will be returned as the result of the execution of this command
}
public abstract class BasicCommand<R> implements Command<R>
{
}
public interface CommandProcessor<C extends Command<?>>
{
public <R> R process(C<R> command);//this is my question... it's illegal to do, but you understand the idea behind it, right?
}
//constrain BasicCommandProcessor to commands that subclass BasicCommand
public class BasicCommandProcessor<C extends BasicCommand<?>> implements CommandProcessor<C>
{
//here, only subclasses of BasicCommand should be allowed as arguments but these
//BasicCommand object should be parameterized by R, like so: BasicCommand<R>
//so the method signature should really be
// public <R> R process(BasicCommand<R> command)
//which would break the inheritance if the interface's method signature was instead:
// public <R> R process(Command<R> command);
//I really hope this fully illustrates my conundrum
public <R> R process(C<R> command)
{
return command.execute();
}
}
public class CommandContext
{
public static void main(String... args)
{
BasicCommandProcessor<BasicCommand<?>> bcp = new BasicCommandProcessor<BasicCommand<?>>();
String textResult = bcp.execute(new BasicCommand<String>()
{
public String execute()
{
return "result";
}
});
Long numericResult = bcp.execute(new BasicCommand<Long>()
{
public Long execute()
{
return 123L;
}
});
}
}
Grundsätzlich mag ich die generische „Prozess“ Methode, um die Art von generischen Parametern des Befehlsobjekts diktieren. Das Ziel besteht darin, verschiedene Implementierungen von CommandProcessor auf bestimmte Klassen zu beschränken, die die Befehlsschnittstelle implementieren, und gleichzeitig die Prozessmethode jeder Klasse aufrufen zu können, die die CommandProcessor-Schnittstelle implementiert und das Objekt des vom Typ angegebenen Typs zurückgibt parametrisiertes Befehlsobjekt. Ich bin mir nicht sicher, ob meine Erklärung klar genug ist. Bitte lassen Sie es mich wissen, wenn weitere Erklärungen benötigt werden. Ich denke, die Frage ist: "Ist das überhaupt möglich?" Wenn die Antwort "Nein" ist, was wäre das beste Work-Around (ich dachte an ein Paar alleine, aber ich hätte gerne ein paar frische Ideen)
Sollte 'BasicCommand'' Command' nicht implementieren? –
Touche, behoben. Danke, dass du das eingefangen hast! – Andrey