У меня возникли трудности с использованием дженериков с константами enum
. Я получаю предупреждение компилятора:Предупреждения компилятора с константами перечисления
Неконтролируемый вызова на «ручке (M)» в качестве члена сырого типа «Test.MessageHandler»
на последней строке ниже фрагменте кода.
Любые подсказки о том, как удалить это предупреждение, были бы высоко оценены.
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'
}
}
Одним из ограничений Java перечислений является то, что вы не можете иметь за значение общего типы. Он не установлен, потому что у вас есть сырой «MessageHandler» - вы могли бы также написать «HANDLERS.get (MessageNumber.LOGOUT)» в предыдущей строке. –