实现接口的匿名类

时间:2015-11-16 13:17:24

标签: java eclipse interface anonymous-class

我有以下界面:

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(){ }
}

实现接口的匿名类有什么问题?

1 个答案:

答案 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(){ }
}