У меня есть следующий код:Почему это непроверенный актер? И как это исправить?
public final <T extends Component> T getComponent(Class<T> type) {
Iterator<Component> it = components.iterator();
while(it.hasNext()) {
Component next = it.next();
if(type.isAssignableFrom(next.getClass()))
return (T)next; // Why is this an unchecked cast from Component to T?
}
return null;
}
И по какой-то причине, return (T)next;
является неконтролируемым литым из компонента Т.
Я не уверен, почему это, потому что T должна простираться Компонент, он должен иметь возможность безопасно применять его для любых подклассов Component, правильно?
Если я вручную делаю return (TestComponent)next;
и меняю тип возврата на TestComponent, он отлично работает, так почему же он не работает с T?
я вижу, однако в моем случае строки '' если (type.isAssignableFrom (next.getClass())) { '' убеждается '' next'' имеет тип '' T'' правильно? – Snakybo
Да 'isAssignableFrom()' проверяет, является ли тип одинаковым или является суперклассом/суперинтерфейсом 'next.getClass()'. Поэтому, если 'T' - это тот же тип, что и« Компонент », это вернет true, но вы по-прежнему не можете использовать« Компонент »для экземпляра' T', так как не каждый «Компонент» будет экземпляром 'T', и поэтому компилятор не допускает этого. –
Я вижу, так что технически это было проверить, если '' next'' был экземпляр '' T'', но при компиляции не знает, что, таким образом, давая предупреждение. – Snakybo