Подтвердить что ты не робот

Generics и Class.asSubclass

Я всегда думал, что следующее должно работать. Я получаю объект, который, как я знаю, Class<X>, где X расширяет класс Xyz. Чтобы сделать его безопасным по типу, я хотел использовать Class.asSubclass, как в следующем методе:

private Class<? extends Xyz> castToXyzClass(Object o) {
    final Class<?> resultClass = (Class<?>) o;
    final Class<? extends Xyz> result = Xyz.class.asSubclass(resultClass);
    return result;
}

Однако в Eclipse он не работает, единственное решение, которое я вижу, - это неконтролируемый отбор. Я бы сказал, что вышеприведенный код должен работать, я уже использовал что-то вроде этого... не знаю, что здесь не так.

4b9b3361

Ответ 1

asSubclass() работает на объекте, на который он вызвал, а не на его параметре, а не на том, к чему он привык, но он читается достаточно хорошо. Вам просто нужно сделать это:

final Class<? extends Xyz> result = resultClass.asSubclass(Xyz.class);

Ответ 2

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

На самом деле, этот метод довольно одинарный (и, я думаю, вы его нашли)... он должен взять необработанный или подстановочный класс и получить более качественный параметр с проверкой времени выполнения, Это не требуется, когда у вас нет пробелов в информации о типе:

class Super {}
class Sub extends Super {}

//...
Class<Sub> subClass = Sub.class;

//both work, but the latter introduces a redundant runtime check
Class<? extends Super> subOfSuper1 = subClass;
Class<? extends Super> subOfSuper2 = subClass.asSubclass(Super.class);