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

2022-09-03 00:34:17

我怎么能用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;
                }
            }
        }
}

但是我不能在泛型类型上执行实例。我该怎么做?谢谢。


答案 1

基本上,由于类型擦除,您无法执行此操作。通常的解决方法是将对象作为参数传递;例如:Class

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

您也可以使用,但这确实具有确切的类型匹配...这不是操作员所做的。运算符和方法都进行测试,以查看值的类型是否与赋值兼容if (clazz.equals(component.getClass())) { ...instanceofinstanceofClass.instanceOf


答案 2

您可以尝试添加几个“测试”方法:

private static <U extends IComponent> boolean testComponent(U u) {
  return true;
}

private static boolean testComponent(Object o) {
  return false;
}

然后,使用 代替 。testComponent(component)component instanceof U

示例代码:

import java.util.*;

class IComponent {
}

class T1 extends IComponent {
}

public class Test {

  public static <U extends IComponent> boolean testComponent(U u) {
    return true;
  }

  public static boolean testComponent(Object o) {
    return false;
  }

  public static void main(String[] args) {
    T1 t = new T1();
    System.out.println("hm? " + (testComponent(t) ? "true" : "false"));
  }
}

输出:

嗯?真