Question

J'ai une classe génériqué que je souhaite sous-classe comme suit:

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

... où la superclasse génériqué est:

public class BaseTable<T extends BaseTableEntry>
{

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

Je comprends l'erreur du compilateur, mais ne peut pas sembler trouver une solution, autre que d'inclure un paramètre supplémentaire dans le constructeur de SomeTable.

Toutes les suggestions?

Merci!

Était-ce utile?

La solution

compile:

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

Il fonctionne avec un casting:

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

mais je suis impatient de quelqu'un affichant l'explication de pourquoi le compilateur nécessite la distribution de la classe.

Autres conseils

Il est possible de définir le constructeur de SomeTable génériquement si vous passez Class à la même manière que vous le faites avec la classe de 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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top