2010-01-25 4 views
9

У меня есть genericised класс, который я желаю подклассы следующим образом:Java: подклассов genericised класс

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>) 
    } 
} 

... где genericised суперкласса:

public class BaseTable<T extends BaseTableEntry> 
{ 

    public BaseTable(int rows, int cols, Class<T> clasz) 
    { 
     ... 
    } 
... 
} 

Я понимаю ошибку компилятора , но не может найти обходного пути, кроме включения дополнительного параметра в конструктор SomeTable.

Любые предложения?

Спасибо!

+1

делает подкласс также должны быть общими? Или это может быть SomeTable расширяет BaseTable ? – Thilo

+0

Нет, 'SomeTable' не нужно генерировать,' public class SomeTable расширяет BaseTable 'отлично. – bguiz

ответ

10

компилируется:

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); 
    } 
} 

, но я с нетерпением ждет, чтобы кто-то проводки объяснения того, почему компилятор требует бросания для класса.

+0

+1. Если он действительно нуждается в SomeTable, чтобы быть общим, я думаю, что ему придется дублировать конструктор суперкласса с дополнительным параметром класса . – Thilo

+0

@SteveB .: Просто чтобы убедиться, что программист знает, что он/она делает. 'super (rows, cols, (класс ) Object.class)' также будет работать, но, выполняя бросок, вы берете на себя ответственность'. –

+0

Re: cast: есть компиляция предупреждения «небезопасный литой» с этим литом ... – Thilo

3

можно определить 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); 
    } 
}