Java: sous-classement d'un genericised classe
J'ai un genericised classe que je souhaite à la sous-classe comme suit:
public class SomeTable<T extends BaseTableEntry>
extends BaseTable<T>
{
public SomeTable(int rows, int cols)
{
super(rows, cols, SomeTableEntry.class);
//Does not compile:
//Cannot find symbol: constructor BaseTable(int, int, java.lang.Class<blah.blah.SomeTableEntry.class>)
}
}
... où le genericised super-classe est:
public class BaseTable<T extends BaseTableEntry>
{
public BaseTable(int rows, int cols, Class<T> clasz)
{
...
}
...
}
Je comprends l'erreur de compilation, mais n'arrive pas à trouver une solution de contournement, d'autres plutôt que d'ajouter un paramètre supplémentaire dans l' SomeTable
constructeur.
Des suggestions?
Merci!
ne la sous-classe doivent également être générique? Ou peut-il être SomeTable s'étend BaseTable<SomeTableEntry>?
Non,
Non,
SomeTable
n'a pas besoin d'être genericised, public class SomeTable extends BaseTable<SomeTableEntry>
est très bien.OriginalL'auteur bguiz | 2010-01-25
Vous devez vous connecter pour publier un commentaire.
Cette compile:
Il fonctionne avec un cast:
mais je suis impatient de quelqu'un qui affiche l'explication de pourquoi le compilateur exige le casting pour la classe.
Juste pour s'assurer que le programmeur sait ce qu'il/elle est en train de faire.
super(rows, cols, (Class<T>)Object.class)
, mais en faisant un cast vous prenez la responsabilité".Re: cast: Il y a compiler avertissement "dangereux" coulé avec ce cast...
Ok, c'est un coup de poignard à l'explication. Depuis SomeTable est générique, il pourrait déclarer une autre sous-classe
SubTable extends SomeTable<SpecialEntry>
. Dans ce cas, codées en dur SomeTableEntry ne marcherait pas non plus, parce que l'attendu effacé type serait maintenant SpecialEntry. Donc, en conclusion, il doit soit faire des sous-table non générique, ou de propager la catégorie " extra paramètre à la génération suivante.En fait, pas besoin d'une autre sous-classe. Il suffit d'écrire
SomeTable<CompletelyUnrelatedBaseTableEntry> x = new SomeTable<CompletelyUnrelatedBaseTableEntry>(row,col)
et être en difficulté.OriginalL'auteur Steve B.
Il est possible de définir la
SomeTable
constructeur générique si vous passezClass
de la même façon que vous le faites avec la classe de base:OriginalL'auteur finnw