匿名 class 实现接口
Anonymous class implementing an interface
我有以下界面:
public interface MessageFactory<T extends Message> {
public T create(Session session);
}
当我这样定义 class 时,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
方法作为抽象方法复制并粘贴到 class 中,错误就会消失:
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(){ }
}
匿名 classes 实现接口有什么问题?
看起来像 IDE 某种错误; Java 的编译器对此非常满意。如果我设置那种情况并使用 Oracle 的 Java8 javac
,它编译得很好。
没关系here on IDEOne 使用非public 类,或者如果我创建这些文件并编译它们:
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(){ }
}
我有以下界面:
public interface MessageFactory<T extends Message> {
public T create(Session session);
}
当我这样定义 class 时,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
方法作为抽象方法复制并粘贴到 class 中,错误就会消失:
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(){ }
}
匿名 classes 实现接口有什么问题?
看起来像 IDE 某种错误; Java 的编译器对此非常满意。如果我设置那种情况并使用 Oracle 的 Java8 javac
,它编译得很好。
没关系here on IDEOne 使用非public 类,或者如果我创建这些文件并编译它们:
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(){ }
}