简体   繁体   English

实现接口的匿名类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM