8
votes

Héritage de l'interface - Paramètres de méthode de changement de change

J'ai des difficultés à comprendre la manière java d'interpréter l'héritage de l'interface, exemple:

public interface Model {
    Model getModel();
    void setModel(Model model);
}

public class BaseModel implements Model {
    @Override
    public BaseModel getModel() { return  null; } // works

    @Override
    public void setModel(BaseModel model) {} // compilation error, it wants Model instead of BaseModel
}


0 commentaires

4 Réponses :


3
votes

C'est comment fonctionne fonctionne fonctionne.

  1. Les paramètres de fonction doivent être exactement identiques.

  2. Les types de retour peuvent peuvent être différents mais doivent être liés.

    Donc, dans votre cas, getmodel est bien car le type de retour ( babeemodel ) est lié à modèle , mais setmodel < / code> n'est pas valide car les types de paramètres sont dissemblables.


0 commentaires

5
votes

Le type de retour de votre première méthode est Covariant et est autorisé et le type de retour ne fait pas partie de la signature de la méthode donc sa autorisation

tandis que le paramètre sur une méthode fait partie de la signature et doit suivre strictement la signature de l'interface et il échoue dans votre cas.

Maintenant que vous avez annoté votre méthode avec @override , vous essayez de remplacer la méthode de la méthode du compilateur de la même manière. Si vous supprimez simplement cette méthode et implémentez la méthode selon l'interface en plus de la mise en œuvre existante, vous surchargez la méthode.


0 commentaires

5
votes

Pour comprendre cela, vous devez vous poser une question "Puis-je la substitution basemodel pour toute utilisation de l'interface modèle "?

Lorsque vous spécialisez la valeur de retour , cela fonctionne bien. Même si getmodel () renvoie un basemodel , il peut toujours être attribué à un modèle modèle variable. xxx

L'autre côté n'est pas vrai, cependant: xxx

si setmodel devait accepter un basemodel Paramètre Vous briseriez sa capacité à être définie avec d'autres implémentations du modèle . Par conséquent, cela n'est pas autorisé.


0 commentaires

2
votes

Nom de la méthode et types de paramètres constitue une signature de méthode en Java et non le type de retour. Lorsque vous remplacez une méthode, la signature de la méthode doit être la même Si vous changez de signature, il sera surchargé et non - pour le voir si vous supprimez l'annotation @override, il fonctionne.


0 commentaires