Domanda

Ho una classe genericised che desidero sottoclasse come segue:

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

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

Qualche suggerimento?

Grazie!

È stato utile?

Soluzione

Questa 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.

Altri suggerimenti

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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top