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!
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);
}
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With