繁体   English   中英

检查对象是否是给定类名的List的实例

[英]Check if an object is instance of List of given class name

给定一个Object o和一个String className = "org.foo.Foo" ,我想检查o是否是List<className>实例

我试过这个,但不会编译:

Class<?> cls = Class.forName(className);
if (o instanceof List<cls>){ // this gives error: cls cannot be resolved to a type
  doSomething();
}

请注意我的输入是Object oString className (请注意类型)。

这是因为类型擦除 该声明

if (o instanceof List<cls>) {
  doSomething();
}

当擦除列表的泛型类型时,将在运行时执行。 因此,没有必要检查泛型类型的instanceof

我认为你可以分两步完成:首先,你检查它是一个列表。

if (o instanceof List)

然后,检查列表中的一个(每个?)成员是否具有给定类型。

for (Object obj : (List) o) {
    if (obj instanceof cls) {
        doSomething();
    }
}

好的,我找到了一个方法......这是一个有点脏代码,但它的工作原理:

if (o instanceof List<?>){
  ParameterizedType pt = (ParameterizedType)o.getClass().getGenericSuperclass();
  String innerClass = pt.getActualTypeArguments()[0].toString().replace("class ", "");
  System.out.println(innerClass.equals(className)); // true
}

我在项目中使用的解决方案。

/**
 * Used to get List of String From Object.
 *
 * 1. used to convert object to list of String.
 * 
 * @param objectList Object List.
 * @return List Of String.
 */
private List<String> getListOfStringFromObject(final Object objectList) {
    List<String> stringList = new ArrayList<>();
    if (objectList instanceof List<?>) {
        for (Object object : (List<?>) objectList) {
            if (object instanceof String) {
                stringList.add((String) object);
            }
        }
    }
    return stringList;
}
public class Main{

    public static void main(String[] args){
        String str = "";
        int oi = 0;
        char c = 'a';
        Main af = new Main();
        checkType(str);
        checkType(oi);
        checkType(c);
        checkType(af);
    }

    public static void checkType(Object o){
        String str = o.getClass().getName();
        switch(str){
            case "java.lang.String":
                System.out.println("String");
                break;  
            case "java.lang.Integer":
                System.out.println("Integer");
                break;
            case "java.lang.Character":
                System.out.println("Char");
                break;
            case "Main":
                System.out.println("Main");
                break;
            default :
                System.out.println("Something else:" + str);
                break;
        }
    }

}

注意>只需更改为public static boolean checkType(Object o) ,然后在每种非默认case return true

如果你想做的是这样的:

class XXX implements InterfaceX {
    @Override
    public void methedX() { }
}

interface InterfaceX {
    void methedX();
}
List<XXX> x = new ArrayList<>();

if(x instanceOf List<InterfaceX>) {
    data.get(0).methedX();
}

您可以尝试使用以下模板:

class TypeHelper <T extends InterfaceX> {
    List<T> data;
    TypeHelper (List<T> data) {
        this.data = data;
    }

    public void func() {
        data.get(0).methedX();
    }
}

TypeHelper helper = new TypeHelper<XXX>(x);
helper.func();

简单的方法。 也许会有所帮助,当然,这不是确切的答案,但它是获得结果的另一种方式。

if (data != null && data.get(0) instanceof Cls) {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM