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!

Foi útil?

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
scroll top