2011-01-22 1 views
3

У меня есть два класса:Как использовать объект класса типа из универсального класса в качестве параметра? - дженериков и отражение в сочетании

public abstract class MyAbstractSuperClass<A, B> { 

    public MyAbstractSuperClass(Class<A> a, Class<B> b) { 
     ... 
    } 

    ... 
} 

public class MyClass<A> extends MyAbstractSuperClass<A, MyOtherClass<A>> { 

    public MyClass(Class<A> a) { 
    super(a, MyOtherClass.class)); 
      ... 
    } 

    ... 
} 

Теперь вы видите, подкласс должен вызвать конструктор суперкласса. В этой строке я получаю следующее сообщение об ошибке:

The constructor MySuperClass<A, MyOtherClass<A>>(Class<A>, Class<MyOtherClass>) is undefined 
  • Так как же я получаю объект типа Class<MyOtherClass<A>>?
  • И как это сделать в вызове супер-конструктора, где я не могу выполнить много?

Заранее спасибо.

+0

В сообщении об ошибке нет класса 'MySuperClass'. Является ли эта ошибка предполагаемой для чтения: 'Конструктор MyAbstractSuperClass <...' –

ответ

-1

Вы должны добавить второй аргумент MyClass конструктор:

public MyClass(Class<A> a, Class<MyOtherClass<A>> bClass) { 
    super(a, bclass)); 
} 

@Bert F: Это «сваливать» в каком-то смысле, но она проходит доллар кому-то, кто на самом деле может обеспечить класс литерал соответствующего типа. Вызывающий абонент знает фактическое значение переменной типа A и поэтому может предоставить литерал класса нужного типа. Из-за стирания MyClass не может этого сделать.

+1

Разве это не просто обойти доллар? Разве код, который пытается создать экземпляр 'MyClass', теперь имеет ту же проблему, что и раньше, чем MyClass? - он не может создать литерал класса конкретного параметризованного типа? –

0

Удалить параметр типа MyOtherClass в определении MyClass. Вы, очевидно, не заинтересованы в этом где-нибудь в корпусе MyClass.

public class MyClass<A> extends MyAbstractSuperClass<A, MyOtherClass> { 
    public MyClass(Class<A> a) { 
     super(a, MyOtherClass.class); 
    } 
} 

Добавить @SuppressWarnings("rawtypes") если предупреждение беспокоит вас.

1

Конструктор ожидает Class<MyOtherClass<A>>, а не Class<MyOtherClass>. Единственный способ, которым я могу думать, чтобы удовлетворить компилятор через уродливую серию забросов:

@SuppressWarnings("unchecked") 
public MyClass(Class<A> a) { 
    super(a, (Class<MyOtherClass<A>>)(Class<?>)MyOtherClass.class); 
} 

Это типа безопасно, как видно через осмотр, так как литерал класс для необработанного типа MyOtherClass такого же, как и для параметризованного MyOtherClass<A>. Но это не останавливает неконтролируемое предупреждение от генерирования, которое может быть подавлено, как указано выше, или просто игнорируется.