如何比较对象实例的类型与泛型类型?

Adi*_*be7 15 java generics reflection

我怎么能用java编写这段代码?

public class ComponentsManager 
    {
        private List<IComponent> list = new ArrayList<IComponent>();

        public <U extends IComponent> U GetComponent() {

            for (IComponent component : list) {

                if(component instanceof U)
                {
                    return component;
                }
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

但我无法对泛型类型执行instanceof.我该怎么办?谢谢.

Ste*_*n C 23

基本上,由于类型擦除,你不能这样做.正常的解决方法是将Class对象作为参数传递; 例如

    public <U extends IComponent> U GetComponent(Class<U> clazz) {
        for (IComponent component : list) {
            if (clazz.isInstance(component)) {
                return clazz.cast(component);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

您也可以使用,if (clazz.equals(component.getClass())) { ...但这确实是类型匹配...这不是instanceof运营商所做的.在instanceof运营商和Class.instanceOf方法都测试,看看如果值的类型是赋值兼容.