Java: une classe Dérivation de génériqué
-
22-09-2019 - |
Question
J'ai une classe génériqué que je souhaite 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ù la superclasse génériqué est:
public class BaseTable<T extends BaseTableEntry>
{
public BaseTable(int rows, int cols, Class<T> clasz)
{
...
}
...
}
Je comprends l'erreur du compilateur, mais ne peut pas sembler trouver une solution, autre que d'inclure un paramètre supplémentaire dans le constructeur de SomeTable
.
Toutes les suggestions?
Merci!
La solution
compile:
public class SomeTable extends BaseTable<SomeTableEntry> {
public SomeTable(int rows, int cols)
{
super(rows, cols, SomeTableEntry.class);
}
}
Il fonctionne avec un casting:
public class SomeTable<T extends BaseTableEntry> extends BaseTable<T> {
public SomeTable(int rows, int cols)
{
super(rows, cols, (Class<T>)SomeTableEntry.class);
}
}
mais je suis impatient de quelqu'un affichant l'explication de pourquoi le compilateur nécessite la distribution de la classe.
Autres conseils
Il est possible de définir le constructeur de SomeTable
génériquement si vous passez Class
à la même manière que vous le faites avec la classe de base:
public class BaseTable<T extends BaseTableEntry>
{
public BaseTable(int rows, int cols, Class<? extends T> clazz)
{
// ...
}
}
class SomeTable<T extends BaseTableEntry>
extends BaseTable<T>
{
public SomeTable(int rows, int cols, Class<? extends T> clazz)
{
super(rows, cols, clazz);
}
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow