Java génériques - substitution d'une méthode abstraite et avoir le type de retour de la sous-classe
Je suis en train de créer un jeu où un ensemble de sous-classes de remplacer une super-classe. Cette super-classe contient une méthode abstraite - le type de retour de ce qui devrait être celle de l'objet à partir de laquelle cette méthode a été appelée, tel qu'il se comporte effectivement comme ceci:
public abstract class SuperClass{
public abstract SuperClass getSelf();
}
public class SubClass extends SuperClass{
@Override
public SubClass getSelf(){
return this;
}
}
Je ne suis pas certain si une telle chose est possible, car je pense que les types de retour de toujours être la même pour le remplacer au travail - toutefois, j'ai pensé à la réponse, s'il existe, se trouve quelque part le long de cette ligne...
public abstract class SuperClass{
public abstract <? extends SuperClass> getSelf();
}
public class SubClass extends SuperClass{
@Override
public SubClass getSelf(){
return this;
}
}
Merci pour toute aide.
edit: ajouté étend à la sous-classe de super-classe, duh
Je ne vois pas comment vous allez utiliser cela. Pourriez-vous me donner un exemple?
OriginalL'auteur Numeron | 2011-06-23
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne:
Notez que j'ai ajouté
extends SuperClass
à votreSubClass
définition. Le type de retour degetSelf
est désigné comme un covariante type de retour.Cela ne fonctionne pas pour moi 🙁
OriginalL'auteur Rob Harrop
Comment à ce sujet:
Je sais que c'est assez répétitif et rien de limites que le type à la même
SubClass
exemple, parce que aussiAnotherSubClass
de satisfaire à la limite, mais au moins, ça devrait faire l'affaire.OriginalL'auteur plouh
Ici est de savoir comment le faire (Depuis le JDK 1.5, il y a cette chose appelée covariante des types de retour, où quelque chose comme cela est possible).
Avis une catégorie similaire définition générique avec Enum (http://download.oracle.com/javase/1,5.0/docs/api/java/lang/Enum.html)
Voir ce qui se passe derrière les coulisses (à l'aide de javap super-classe sous-classe):
Remarquez comment la sous-classe de la méthode a un autre type de retour, qui est un sous-type de la super méthode de type de retour.
Btw, notez que
public SuperClass getSelf();
dans la classeSubClass
est en fait un synthétique méthode.OriginalL'auteur Nick