Java: Class <T>и Class: Разница при использовании внутри / за пределами класса - PullRequest
4 голосов
/ 21 января 2010

У меня есть класс, который должен использовать параметр Class<T> (см. Мой предыдущий полусвязанный вопрос ). Это:

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>]
    }
...
}

Мне интересно, почему конструктор (с 2 параметрами) не работает, но когда я вызываю ту же самую вещь из внешнего класса, например так:

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

Он компилируется и запускается без жалоб. Почему так и как обойти это?

Спасибо!

1 Ответ

4 голосов
/ 21 января 2010

Конструктор для класса, который имеет параметры универсального типа, может использоваться для создания этого класса с любыми типами (которые соответствуют границам в объявлении класса). Так что же произойдет, если кто-то скажет:

new BaseTable<SomeTypeUnrelatedToStringTableEntry>(rows, cols)

В качестве обходного пути используйте статический фабричный метод:

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

Или вы можете создать подкласс:

class StringTableEntryBaseTable extends BaseTable<StringTableEntry>
{
    StringTableEntryBaseTable(int rows, int cols)
    {
        super(rows, cols, StringTableEntry.class);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...