我有以下界面:
public interface MessageFactory<T extends Message> {
public T create(Session session);
}
当我像这样定义类时,Eclipse在下面的注释中给出了错误:
public abstract class MessageType<T extends Message> implements MessageFactory<T>{
public static final MessageType<ObjectMessage> PLAYER_REGISTER = new MessageType<ObjectMessage>() {
@Override
public ObjectMessage create(Session session) { //Error, remove @Override annotation
//impl
}
};
private MessageType(){ }
}
但是如果我将create
方法从接口复制并粘贴到类中作为抽象方法,那么错误就会消失:
public abstract class MessageType<T extends Message> implements MessageFactory<T>{
public static final MessageType<ObjectMessage> PLAYER_REGISTER = new MessageType<ObjectMessage>() {
@Override
public ObjectMessage create(Session session) { //Fine
//impl
}
};
public abstract T create(Session session);
private MessageType(){ }
}
实现接口的匿名类有什么问题?
答案 0 :(得分:3)
看起来像某种IDE的bug; Java编译器非常满意它。如果我设置了这种情况并使用Oracle的Java8 javac
,那么编译就好了。
很好here on IDEOne使用非公共类,或者如果我创建这些文件并编译它们:
Message.java
:
public class Message { }
ObjectMessage.java
:
public class ObjectMessage extends Message { }
Session.java
:
public class Session { }
MessageFactory.java
:
public interface MessageFactory<T extends Message> {
public T create(Session session);
}
MessageType.java
:
public abstract class MessageType<T extends Message> implements MessageFactory<T>{
public static final MessageType<ObjectMessage> PLAYER_REGISTER = new MessageType<ObjectMessage>() {
@Override
public ObjectMessage create(Session session) { //Error, remove @Override annotation
return null;
}
};
private MessageType(){ }
}