Хотя я знаю, что вы не можете получить тип родового во время выполнения из-за стирания стилей, мне было интересно, можно ли его получить во время компиляции.Получите общий класс во время компиляции
class ObjectHandle<T extends ObjType> {
T obj;
void setObj(T o) {
obj = o;
}
}
class ObjType {}
class SubObjType extends ObjType {}
...
ObjectHandle<SubObjType> handle = new ObjectHandle<SubObjType>();
...
ObjType obj = [method that returns an ObjType];
if(obj instanceof [handle's generic class, here SubObjType]) {
handle.setObj(obj); // cast???
}
Здесь компилятор знает тип родового из handle
и то, что я хочу что-то, так что я не должен изменить тип handle
и instanceof
чека (и отливы), когда я решил изменить класс (в коде, а не во время выполнения, конечно).
но компилятор не знает тип 'obj', так что вы должны использовать' instanceof' в любом случае. –
Это похоже на все, что вам нужно, это сокращение для вашего SubObjType, что вы можете сделать на C с typedef. У Java этого нет. –
Если вам не нужен код в общем случае, и ваша единственная проблема заключается в том, что фактический класс может измениться в коде, я бы просто заменил 'if' на' assert handle instanceof SubObjType'. Или вы действительно хотите, чтобы вызов 'handle.setObj' был пропущен, если и когда фактический тип был изменен в коде? – VGR