Как использовать объект типа класса из универсального класса в качестве параметра? - дженерики и рефлексия в сочетании - PullRequest
3 голосов
/ 22 января 2011

У меня есть два класса:

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>>?
  • А как мне это сделать в вызове супер-конструктора, где я не могу выполнить много?

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

Ответы [ 3 ]

1 голос
/ 22 января 2011

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

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

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

0 голосов
/ 22 января 2011

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

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

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

0 голосов
/ 22 января 2011

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

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

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

...