2010-01-25 17 views
9

Ho una classe genericised che desidero sottoclasse come segue:Java: sottoclasse una classe 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>) 
    } 
} 

... dove la superclasse genericised è:

public class BaseTable<T extends BaseTableEntry> 
{ 

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

Capisco l'errore del compilatore , ma non riesco a trovare una soluzione alternativa, oltre a includere un parametro aggiuntivo nel costruttore SomeTable.

Qualche suggerimento?

Grazie!

+1

fa la sottoclasse anche bisogno di essere generico? O può essere SomeTable estende BaseTable ? – Thilo

+0

No, 'SomeTable' non ha bisogno di essere generalizzato,' La classe pubblica SomeTable estende BaseTable 'va bene. – bguiz

risposta

10

Questo compila:

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

Funziona con un cast:

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

ma non vedo l'ora a qualcuno distacco la spiegazione del motivo per cui il compilatore richiede il cast per la classe.

+0

+1. Se ha davvero bisogno di SomeTable per essere generico, penso che dovrà duplicare il costruttore della superclasse con il parametro extra Classe . – Thilo

+0

@SteveB .: Solo per assicurarsi che il programmatore sappia cosa sta facendo. 'super (rows, cols, (Classe ) Object.class)' funzionerà anche, ma facendo un cast ci si assume la responsabilità'. –

+0

Ri: cast: C'è un avviso di compilazione "cast non sicuro" con quel cast ... – Thilo

3

E 'possibile definire il costruttore SomeTable genericamente se si passa Class ad essa nello stesso modo come si fa con la classe di 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); 
    } 
} 
Problemi correlati