Frage

Ich habe eine genericised Klasse, dass ich Unterklasse wünschen, wie folgt:

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

... wo die genericised geordnete Klasse ist:

public class BaseTable<T extends BaseTableEntry>
{

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

Ich verstehe den Compiler-Fehler, aber kann nicht scheinen, eine Abhilfe zu finden, die andere als einen zusätzlichen Parameter in dem SomeTable Konstruktor aufzunehmen.

Irgendwelche Vorschläge?

Danke!

War es hilfreich?

Lösung

Dies kompiliert:

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

Es funktioniert mit einer Besetzung:

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

, aber ich freue mich auf jemand veröffentlichen die Erklärung dafür, warum der Compiler die Besetzung für die Klasse erforderlich ist.

Andere Tipps

Es ist möglich, den SomeTable Konstruktor allgemein zu definieren, wenn Sie Class, um es auf die gleiche Weise passieren, wie Sie mit der Basisklasse zu tun:

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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top