java - 实现接口(interface)的匿名类

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

但是如果我将接口(interface)中的 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(){ }
}

匿名类实现接口(interface)有什么问题?

最佳答案

看起来像是某种 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(){ }
}

关于java - 实现接口(interface)的匿名类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33736367/

相关文章:

java - h :commandLink not working when inside a list

java - 我的设备出现通知问题

eclipse build.gradle 有一个红色斜线穿过它,这是什么意思?

java - 默认情况下,Project->Build Project in Eclipse with m2e 是否包含任何 Maven 目标?

c# 测试对象是否使用 .GetType().GetInterface(typeof(ISurface<>).FullName) 实现任何类型的 ISurface<T>

angular - 如何连接 Output() 和 Input() 装饰器?

java - 为什么类转换在 run 方法中失败,即使检查了 instanceof、outside run

java - 在java 8中的gradle中的jar的Manifest文件中添加Classpath

java - "type X[][] should explicitly be cast to Object[][] for the invocation of the varargs"

实现特定接口(interface)的 "Type"的C#列表