为什么这是一个未经检查的演员?以及如何解决它?

Sna*_*ybo 5 java generics iterator

我有以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

由于某种原因,return (T)next;是从Component到T.的未经检查的演员表.

我不确定为什么会这样,因为T必须扩展Component,它应该能够安全地将它转换为Component的任何子类,对吧?

如果我手动执行return (TestComponent)next;并将返回类型更改为TestComponent它工作正常,那么为什么它不适用于T?

jta*_*orn 7

其他人已经描述了问题,这里是解决方案(使用更清洁的测试):

if(type.isInstance(next) {
  return type.cast(next);
}
Run Code Online (Sandbox Code Playgroud)