Java: Subclassificando uma classe genicizada
-
22-09-2019 - |
Pergunta
Eu tenho uma classe genicizada que desejo subclasse da seguinte maneira:
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>)
}
}
... onde está a superclasse genicalizada:
public class BaseTable<T extends BaseTableEntry>
{
public BaseTable(int rows, int cols, Class<T> clasz)
{
...
}
...
}
Eu entendo o erro do compilador, mas não consigo encontrar uma solução alternativa, além de incluir um parâmetro extra no SomeTable
construtor.
Alguma sugestão?
Obrigado!
Solução
Isso compila:
public class SomeTable extends BaseTable<SomeTableEntry> {
public SomeTable(int rows, int cols)
{
super(rows, cols, SomeTableEntry.class);
}
}
Funciona com um elenco:
public class SomeTable<T extends BaseTableEntry> extends BaseTable<T> {
public SomeTable(int rows, int cols)
{
super(rows, cols, (Class<T>)SomeTableEntry.class);
}
}
Mas estou ansioso para alguém postar a explicação de por que o compilador exige o elenco para a classe.
Outras dicas
É possível definir o SomeTable
construtor genericamente se você passar Class
Para isso da mesma maneira que você com a classe 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);
}
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow