L'extension de la classe de base abstraite contenant méthode générique en java
Je me suis donné une classe de Base comme ceci:
Class MyBase{
public abstract <T> Student assign (T object);
}
Je suis étendant comme ci-dessous:
Class MyClass extends MyBase{
@Override
public abstract <T> Student assign (T object){
Student stew = new Student();
......
}
}
Mon utilisation est: le passé dans l'objet doit être de type Enseignant. Dans la méthode que je veux créer un nouvel Élève qui permettra d'obtenir des valeurs en invoquant les fonctions des Enseignants. (Par exemple, le ragoût.setTeacherName = enseignant.getName();) Et puis le retour de l'Étudiant à l'appelant.
Questions:
a) Comment puis-je obtenir le comportement voulu?
b) quelle est la différence entre déclarant MyBase la façon actuelle vs. faire MyBase ?
c) je suis intéressé à connaître la solution dans le cas où je PEUX changer de classe de Base et je NE peut pas modifier la classe de Base.
Merci d'avance pour votre aide. Aussi, s'il y a des ressources utiles/tutoriels que vous pouvez m'indiquer ce serait génial. Merci encore.
Vous devez vous connecter pour publier un commentaire.
Si vous ne pouvez pas modifier la classe de base, il n'est pas vraiment une façon de faire qui implique des génériques. Il y a deux choses que vous pourriez faire. L'un, vérifiez le type à l'exécution de l'objet et de faire une chose si il est un enseignant, un autre si ce n'.
Deux, de créer deux
assign
méthodes de Maclasse, qui remplace le générique de la méthode dans la classe de base, et une non-méthode générique qui prend juste un Enseignant en tant que paramètre.Lorsque la méthode est appelée, si le type de compilation de l'Enseignant, le compilateur va choisir le plus spécifique de la surcharge de la méthode:
Cependant, je préfère de loin l'une des solutions qui modifie MyBase.
Modifiées afin d'ajouter: Vous pouvez déclarer le second, plus spécifique
assign
méthode à une méthode générique, comme suit:Mais c'est vraiment la même que dans le deuxième exemple ci-dessus. La méthode ne remplace pas la méthode dans la classe de base, il repose toujours sur le compilateur de la cueillette la plus spécifique de la surcharge au moment de la compilation et de l'effacement de la signature de la méthode est exactement la même que la non-méthode générique dans le deuxième exemple:
Il semble juste un peu plus comme une substitution de la méthode de la classe de base car c'est un type générique de la variable et le paramètre est nommé
object
au lieu deteacher
. Mais essayez de rester un@Override
annotation sur elle et le compilateur vous dire qu'il n'est pas de remplacer ou de mettre en œuvre une méthode à partir d'un supertype.Et vous avez encore le
<T>
méthode générique de traîner qui n'a pas mis le nom du formateur, et si jamais vous avez un Professeur de l'objet qui n'est pas déclaré en tant que tel, le compilateur va choisir le mal de surcharge et vous allez être gratter la tête en se demandant pourquoi, si l'objet est un Enseignant, le nom du formateur ne pas se fixer sur l'étudiant.Vous ne pouvez pas garantir que le
object
être transmis àMyClass
'sassign
méthode est unTeacher
, siMyBase
est défini de cette façon. Si vous êtes autorisé à modifierMyBase
, procédez de la manière suivante:et l'étendre avec votre classe:
Cela permettra de garantir que les
object
transmis est unTeacher
, même si c'est vraiment une instance d'une sous-classe deTeacher
.MODIFIER: une Autre façon de modifier
MyBase
. Faire le paramètre générique partie de la définition de la classe au lieu de la définition de la méthode.Voici Oracle Java Génériques Tutoriel.
Méthodes génériques sont généralement conçues pour fonctionner avec n'importe quel type fourni, par opposition à des classes génériques, qui peuvent être spécialisés pour travailler avec les types de béton. C'est une fonctionnelle vs OO approche. Donc, ce que vous voulez probablement, c'est d'avoir une classe générique avec un paramètre T:
MyBase<T>
ont l'utilisation d'une méthode de ce paramètre
public abstract Student assign (T object)
et ensuite se spécialiser à l'utilisation des enseignants
MyClass extends MyBase<Teacher>
avec un
public Student assign (Teacher object)
La plupart de mes méthodes génériques sont statiques précisément pour cette raison - si une méthode d'instance est réglée, il est logique que le paramètre de type appartient à la classe plutôt que de la méthode. Habituellement, bien sûr.