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 он не работает, единственное решение, которое я вижу, - это неконтролируемый отбор. Я бы сказал, что вышеприведенный код должен работать, я уже использовал что-то вроде этого... не знаю, что здесь не так.
Ответы
Ответ 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);