Pregunta

Tengo una clase genericised que deseo subclase de la siguiente manera:

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>)
    }
}

... donde la superclase genericised es:

public class BaseTable<T extends BaseTableEntry>
{

    public BaseTable(int rows, int cols, Class<T> clasz)
    {
        ...
    }
...
}

Me entiende el error del compilador, pero parece que no puede encontrar una solución, aparte de incluir un parámetro adicional en el constructor SomeTable.

¿Alguna sugerencia?

Gracias!

¿Fue útil?

Solución

Esto compila:

public class SomeTable extends BaseTable<SomeTableEntry> {
    public SomeTable(int rows, int cols)
    {
        super(rows, cols, SomeTableEntry.class);
    }
}

Funciona con un reparto:

public class SomeTable<T extends BaseTableEntry> extends BaseTable<T> {
    public SomeTable(int rows, int cols)
    {
        super(rows, cols, (Class<T>)SomeTableEntry.class);
    }
}

pero yo estoy deseando que alguien ha publicado la explicación de por qué el compilador requiere el elenco para la clase.

Otros consejos

Es posible definir el constructor SomeTable genéricamente si pasa Class a ella de la misma manera como lo hace con la clase 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top