Джава:Создание подкласса обобщенного класса
-
22-09-2019 - |
Вопрос
У меня есть обобщенный класс, который я хочу создать подкласс следующим образом:
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
конструктор.
Какие-либо предложения?
Спасибо!
Решение
Это компилирует:
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);
}
}
но я с нетерпением жду, когда кто-нибудь опубликует объяснение, почему компилятор требует приведения типов для класса.
Другие советы
Можно определить 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);
}
}
Не связан с StackOverflow