enum
の定数でジェネリックを使用するのが難しいです。以下のスニペットの最後の行に「Test.MessageHandler」列挙定数を使用したコンパイラの警告
生タイプのメンバーとして「ハンドル(M)」に
未確認コール:私は、コンパイラの警告を取得しています。
この警告を削除する方法についてのヒントは、高く評価されます。
public class Test { private enum MessageNumber { LOGIN, LOGOUT } private interface Message {} private static class LoginMessage implements Message {} private static class LogoutMessage implements Message {} private interface MessageHandler<M extends Message> { void handle(M msg); } private static class LoginMessageHandler implements MessageHandler<LoginMessage> { public void handle(LoginMessage msg) {System.out.println(msg);} } private static class LogoutMessageHandler implements MessageHandler<LogoutMessage> { public void handle(LogoutMessage msg) {System.out.println(msg);} } private static final Map<MessageNumber, MessageHandler> HANDLERS = new ConcurrentHashMap<MessageNumber, MessageHandler>() {{ put(MessageNumber.LOGIN, new LoginMessageHandler()); put(MessageNumber.LOGOUT, new LogoutMessageHandler()); }}; public static void main(String[] args) { MessageHandler loginHandler = HANDLERS.get(MessageNumber.LOGIN); loginHandler.handle(new LoginMessage()); //Compiler warning: Unchecked call to 'handle(M)' as a member of raw type 'Test.MessageHandler' } }
一つは、あなたが持つことができないということですごとの値は、一般的なタイプ。これは未処理の 'MessageHandler'を持っているためチェックされません。前の行に' HANDLERS.get(MessageNumber.LOGOUT) 'と同じように書くことができます。 –