Вы уже знаете, из различных ошибок компиляции, которые были у вас изначально, ваша исходная реализация не может делать то, что вы сейчас выяснили, это то, что вы действительно хотите делать. В комментариях к своему ответу @daniu называет одну причину, почему это так.
Ваш исходный код хочет сделать то, что язык запрещает . А именно: Переопределите метод, используя сигнатуру, которая полностью отличается от супер-сигнатуры .
Таким образом, вы не хотите структурировать свое приложение так, как проиллюстрирован код в исходном вопросе. Чтобы сделать то, что вы говорите, что вы на самом деле хотите сделать, ваш исходный код нуждается в некоторых существенных рефакторах. Как и код в моем первом ответе. Отсюда этот отдельный ответ ...
public interface MessageBus< V > {
V evaluate( Message<V> msg );
}
public interface CommandBus< V > {
V evaluate( Command<V> msg );
}
public interface EventBus< V > {
V evaluate( Event<V> msg );
}
...
public interface Message < V >{
V evaluate( );
}
public interface Command< V > extends Message< V >{
V evaluate( );
}
...
public class StandardCmdBus {
public static <S, T extends Command<S>> S evaluate( T cmd ){ return cmd.evaluate(); }
}
Я демонстрирую, как это можно было бы использовать вот так ...
public static void main(String args[]) {
Stream< Command< ? > > shellCmds = of( () -> 3.14, () -> "javac", () -> "gcc", () -> 42.424242D, () -> "grep", () -> 666);
Stream< Command< ? > > robotCmds = of( () -> "Assemble 666,666,666,666 Cars!", () -> "Exterminate!", () -> "Disallow: /questions/63242515/", () -> 777.9311, () -> "Rescue Will Robinson!", () -> "Kill all humans!", () -> 666);
Stream< Message< ? > > msgs = of( () -> "What hath God wrought?", () -> "Sending out an S.O.S...", () -> "I like apples...", () -> 666, () -> "Friends of space, how are you all? Have you eaten yet? Come visit us if you have time.", () -> "?.?.?", () -> "The answer is...", () -> 42);
Stream< Event< ? > > evts = of( () -> "The Big Bang", () -> "First Contact", () -> 867.5309, () -> "The Moon Landing", () -> "onLoad()", () -> 666, () -> "The Rapture" );
Stream< Query< ? > > queries = of( () -> "The Ultimate Query...", () -> 42 );
CommandBus< ? > cmdBus = ( cmd ) -> cmd.evaluate( );
MessageBus< ? > msgBus = ( msg ) -> msg.evaluate( );
EventBus< ? > evtBus = ( evt ) -> evt.evaluate( );
QueryBus< ? > qBus = ( q ) -> q.evaluate( );
/* Totally type safe; no unchecked warnings (i.e. no casts invovled) */
robotCmds.map( StandardCmdBus::evaluate ).forEach( out::println );
/* Less type safe; But totally fine; „uses unchecked or unsafe opertions“ (i.e. casts invovled) */
use( shellCmds, cmdBus::evaluate );
use( msgs, msgBus::evaluate );
use( evts, evtBus::evaluate );
use( queries, qBus::evaluate );
Message< String > wtf = ( ) -> "// should compile error";
/* cmdBus.evaluate( wtf );*/ /* error: incompatible types: Message<String> cannot be converted to Command<CAP#1> */
}
... Что выводит на печать …
Assemble 666,666,666,666 Cars!
Exterminate!
Disallow: /questions/63242515/
777.9311
Rescue Will Robinson!
Kill all humans!
666
...
-----------
What hath God wrought?
Sending out an S.O.S...
I like apples...
666
Friends of space, how are you all? Have you eaten yet? Come visit us if you have time.
?.?.?
The answer is...
42
...
-----------
The Ultimate Query...
42
...
Ваша исходная реализация слишком рьяно использует Generics. В какой-то момент мы все виноваты в этом. Это классная форма полиморфизма. Но при неправильном использовании они создают больше проблем, чем решают.