4 Stimmen

Java: Class<T> und Class: Unterschied bei Verwendung innerhalb/außerhalb der Klasse

Ich habe eine Klasse, die eine Class<T> Parameter (siehe mein vorheriges halb-verwandtes Frage ). Das ist es:

public class BaseTable<T extends TableEntry>
{
    protected Class<T> mClass;
    ...

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

    public BaseTable(int rows, int cols)
    {
        this(rows, cols, StringTableEntry.class);
        //Does NOT compile:
        //expected [int, int, Class<T>], but got
        //[int, int, Class<blah.blah.StringTableEntry>]
    }
...
}

Ich wundere mich, warum der Konstruktor (mit 2 Parametern) nicht funktioniert, aber wenn ich genau die gleiche Sache von einer externen Klasse aufrufen, wie dies:

    mSomeTable = new BaseTable<StringTableEntry>(2, 2, StringTableEntry.class);

Er kompiliert und läuft ohne Beanstandungen. Warum ist das so, und wie kann man das umgehen?

Gracias.

4voto

Laurence Gonsalves Punkte 131009

Ein Konstruktor für eine Klasse mit generischen Typparametern kann verwendet werden, um diese Klasse mit beliebigen Typen zu konstruieren (die in die Grenzen der Klassendeklaration passen). Was passiert also, wenn jemand sagt:

new BaseTable<SomeTypeUnrelatedToStringTableEntry>(rows, cols)

?

Als Abhilfe können Sie eine statische Fabrikmethode verwenden:

public static BaseTable<StringTableEntry> newStringTableEntryBaseTable(
    int rows, int cols)
{
    return new BaseTable<StringTableEntry>(rows, cols, StringTableEntry.class);
}

Oder Sie können eine Unterklasse erstellen:

class StringTableEntryBaseTable extends BaseTable<StringTableEntry>
{
    StringTableEntryBaseTable(int rows, int cols)
    {
        super(rows, cols, StringTableEntry.class);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X