【问题标题】:Anonymous class implementing an interface实现接口的匿名类
【发布时间】:2015-11-16 13:17:24
【问题描述】:

我有如下界面:

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

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

【问题讨论】:

  • @T.J.Crowder 但在第一个 sn-p abstract class MessageType 无论如何都应该从实现的接口继承 T create(Session session) 方法,不是吗?
  • @T.J.Crowder 不清楚。匿名类扩展了 MessageType ,后者又实现了接口。因此匿名类实现了接口。
  • @T.J.Crowder 你没有实现接口,你是 MessageType 的子类 如果我们是实现接口的类型的子类,那么子类也将实现接口。所以我们只需要重写它的方法。我真的不明白我的例子中的问题。
  • @St.Antario:没错,您将MessageType 标记为抽象。我无法复制错误:ideone.com/hMBPMX 你确定这不是 IDE 错误吗?
  • @T.J.Crowder 也许吧。我用 eclipse... 还是谢谢你。

标签: java eclipse interface anonymous-class


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2016-07-31
    相关资源
    最近更新 更多