Java: создание подклассов обобщенного класса - PullRequest
9 голосов
/ 25 января 2010

У меня есть обобщенный класс, который я хочу разделить на подклассы следующим образом:

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

... где обобщенный суперкласс:

public class BaseTable<T extends BaseTableEntry>
{

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

Я понимаю ошибку компилятора, но не могу найти обходного пути, кроме как включить дополнительный параметр в конструктор SomeTable.

Есть предложения?

Спасибо!

Ответы [ 2 ]

10 голосов
/ 25 января 2010

Это компилируется:

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

Работает с кастом:

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

но я с нетерпением жду, когда кто-нибудь опубликует объяснение, почему компилятор требует приведение класса.

3 голосов
/ 25 января 2010

Можно определить конструктор SomeTable в общем случае, если вы передадите ему Class так же, как в базовом классе:

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