![](/img/trans.png)
[英]How to check if a given object is an instance of the class name given in a String?
[英]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 o
和String 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.