2010-01-25 14 views
9

tengo una clase genericised que deseo subclase de la siguiente manera:Java: Crear subclases de una clase genericised

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

entiendo 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!

+1

qué la subclase también tienen que ser genéricos? ¿O puede ser SomeTable extends BaseTable ? – Thilo

+0

No, 'SomeTable' no necesita ser genérico,' public class SomeTable extends BaseTable 'está bien. – bguiz

Respuesta

10

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.

+0

+1. Si realmente necesita SomeTable para ser genérico también, creo que tendrá que duplicar el constructor de la superclase con el parámetro extra Clase . – Thilo

+0

@SteveB .: Solo para asegurarnos de que el programador sepa lo que está haciendo. 'super (rows, cols, (Class ) Object.class)' también funcionará, pero al hacer un reparto, asumes la responsabilidad. –

+0

Re: cast: Hay una advertencia de compilación "cast inseguro" con ese elenco ... – Thilo

3

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); 
    } 
} 
Cuestiones relacionadas