Java: Subclassing a genericised class
-
22-09-2019 - |
문제
I have a genericised class that I wish to subclass as follows:
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>)
}
}
... where the genericised superclass is:
public class BaseTable<T extends BaseTableEntry>
{
public BaseTable(int rows, int cols, Class<T> clasz)
{
...
}
...
}
I understand the compiler error, but cannot seem to find a workaround, other than to include an extra parameter in the SomeTable
constructor.
Any suggestions?
Thanks!
해결책
This compiles:
public class SomeTable extends BaseTable<SomeTableEntry> {
public SomeTable(int rows, int cols)
{
super(rows, cols, SomeTableEntry.class);
}
}
It works with a cast:
public class SomeTable<T extends BaseTableEntry> extends BaseTable<T> {
public SomeTable(int rows, int cols)
{
super(rows, cols, (Class<T>)SomeTableEntry.class);
}
}
but I'm looking forward to someone posting the explanation for why the compiler requires the cast for the class.
다른 팁
It is possible to define the SomeTable
constructor generically if you pass Class
to it the same way as you do with the base 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