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
}
4 Réponses :
C'est comment fonctionne fonctionne fonctionne. p>
Les paramètres de fonction doivent être exactement identiques. P> li>
Les types de retour peuvent em> peuvent être différents mais doivent em> être liés. p> li>
ol>
Donc, dans votre cas, getmodel code> est bien car le type de retour ( babeemodel code>) est lié à modèle code>, mais setmodel < / code> n'est pas valide car les types de paramètres sont dissemblables. p>
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 p>
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. P>
Maintenant que vous avez annoté votre méthode avec @override code>, 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. P>
Pour comprendre cela, vous devez vous poser une question "Puis-je la substitution Lorsque vous spécialisez la valeur de retour , cela fonctionne bien. Même si L'autre côté n'est pas vrai, cependant: p> si basemodel code> pour toute utilisation de l'interface code> modèle code>"? getmodel () code> renvoie un basemodel code>, il peut toujours être attribué à un modèle modèle code> variable. P> setmodel code> devait accepter un basemodel code > Paramètre Vous briseriez sa capacité à être définie avec d'autres implémentations du modèle code> code>. Par conséquent, cela n'est pas autorisé. P> P>
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. P>