Sorularımın kelimeleri kullanarak açıklamak kolay değildir, neyse ki gösterilmesi çok zor değildir. Yani, bana ayı:İstenilen sonucu elde etmek için jenerik ve kalıtım düzgün şekilde nasıl karıştırılır?
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;
}
});
}
}
Temelde, jenerik "süreç" yöntemi Komut nesnesinin jenerik parametrenin türünü dikte etmek istiyorum. Amaç, CommandProcessor'un farklı uygulamalarını Komuta arabirimini uygulayan belirli sınıflara kısıtlayabilmek ve aynı zamanda CommandProcessor arabirimini uygulayan herhangi bir sınıfın işlem yöntemini çağırabilmek ve belirtilen nesne türünü döndürmesini sağlamaktır. parametarized komut nesnesi. Açıklamamın yeterince açık olup olmadığından emin değilim, bu yüzden daha fazla açıklama gerekirse lütfen bana bildirin. Sanırım, soru şu ki: "Bunu yapmak mümkün mü acaba?" Cevabınız "Hayır" ise, en iyi iş ne olurdu (kendi başıma bir çift düşündüm, ama yeni fikirler istiyorum)
BasicCommand, 'Command' komutunu uygulamamalı mı? –
Touche, düzeltildi. Onu yakaladığın için teşekkürler! – Andrey