2015-11-16 1 views
1

J'ai l'interface suivante:classe anonyme mise en œuvre d'une interface

public interface MessageFactory<T extends Message> { 

    public T create(Session session); 
} 

quand je définir la classe comme ça, Eclipse me donne l'erreur dans le commentaire ci-dessous sur cette ligne:

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

Mais si je copie et colle la méthode create de l'interface dans la classe en tant que méthode abstraite, l'erreur disparaît:

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

Quel est le problème avec les classes anonymes implémentant des interfaces?

+0

@TJCrowder mais dans le premier extrait 'abstraite MessageType' de classe doit hériter de toute façon' T créer (session de session) 'méthode d'interface implémentée, n'est-ce pas? – Yura

+1

@ T.J.Crowder Pas clair. La classe anonyme étend le MessageType qui à son tour implémente l'interface. Par conséquent, la classe anonyme implémente l'interface. –

+1

@ T.J.Crowder __Vous n'implémentez pas l'interface, vous sous-classez MessageType__ Si nous sous-classons un type implémentant une interface, la sous-classe implémentera également l'interface. Donc, nous avons juste besoin de remplacer ses méthodes. Je ne comprends vraiment pas le problème dans mon exemple. –

Répondre

3

Cela ressemble à un bogue d'IDE; Le compilateur de Java en est parfaitement satisfait. Si je configure cette situation et utilise Java8 javac d'Oracle, il compile bien.

Il est bien here on IDEOne en utilisant des classes non publiques, ou si je crée ces fichiers et les compiler:

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