Java: Subclassing a genericised class

bguiz picture bguiz · Jan 25, 2010 · Viewed 18.8k times · Source

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!

Answer

Steve B. picture Steve B. · Jan 25, 2010

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.