[英]Anonymous class implementing an interface
I have the following interface:我有以下界面:
public interface MessageFactory<T extends Message> {
public T create(Session session);
}
when I define the class like this, Eclipse gives me the error in the comment below on that line:当我像这样定义类时,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(){ }
}
But if I copy-and-paste the create
method from the interface into the class as an abstract method, the error goes away:但是,如果我将接口中的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(){ }
}
What's wrong with anonymous classes implementing interfaces?实现接口的匿名类有什么问题?
Looks like an IDE bug of some kind;看起来像是某种 IDE 错误; Java's compiler is perfectly happy with it. Java 的编译器对此非常满意。 If I set up that situation and use Oracle's Java8 javac
, it compiles just fine.如果我设置这种情况并使用 Oracle 的 Java8 javac
,它编译得很好。
It's fine here on IDEOne using non-public classes, or if I create these files and compile them:在 IDEOne 上使用非公共类很好,或者如果我创建这些文件并编译它们:
Message.java
: Message.java
:
public class Message { }
ObjectMessage.java
: ObjectMessage.java
:
public class ObjectMessage extends Message { }
Session.java
: Session.java
:
public class Session { }
MessageFactory.java
: MessageFactory.java
:
public interface MessageFactory<T extends Message> {
public T create(Session session);
}
MessageType.java
: 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(){ }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.