Java 获取“;instanceof”;的泛型类型非法;共乘错误
在我的代码中有3个自定义类Java 获取“;instanceof”;的泛型类型非法;共乘错误,java,android,Java,Android,在我的代码中有3个自定义类 CheckinTemplate Employee Status 有一种情况是,对象o,可能是上述类列表中的任何一个。我想进行如下比较,并执行某些逻辑,但出现了一个错误“instanceof的非法泛型类型” if(o instanceof List){ }else if(o instanceof List){ }else if(o instanceof List){ } 这无法完成,因为运行时会计算的instanceof,但在编译过程中会删除泛型类型参数。这意味着在运
CheckinTemplate
Employee
Status
有一种情况是,对象o
,可能是上述类列表中的任何一个。我想进行如下比较,并执行某些逻辑,但出现了一个错误“instanceof的非法泛型类型”
if(o instanceof List){
}else if(o instanceof List){
}else if(o instanceof List){
}
这无法完成,因为运行时会计算的instanceof
,但在编译过程中会删除泛型类型参数。这意味着在运行时,List
和List
之间没有区别
您可以检查o instanceof List
(或者o instanceof List
,如果您想避免使用原始列表
类型)。如果是,您可以将其强制转换为列表
(或列表
),然后对其元素运行instanceof
,以确定其类型
if (o instanceof List) {
List list = (List) o;
for (Object e : list) {
if (e instanceof CheckinTemplate) {
} else if (e instanceof Employee) {
} else if (e instanceof Status) {
}
}
}
有两种方法可以做到这一点:一种是检查对象的类名并将其和字符串进行比较
if(o.getClass.toString().equals("myClass")){
}
其次,您可以像这样检查类的实例
if (object instanceof MyClass) {
}
你在做什么你在尝试(
o instanceof List
这是错误的,像array.get(x)
或对象instanceof CheckinTemplate
在If条件下!Java语言规范声明:
:
如果instanceof运算符后面提到的ReferenceType不表示可重新定义的引用类型,则为编译时错误(§4.7)
及
当且仅当下列条件之一成立时,类型才可重新定义:
- 它引用非泛型类或接口类型声明
- 它是一种参数化类型,其中所有类型参数都是无界通配符
- 这是一种原始类型
这是可以理解的,因为在编译时类型信息丢失并且没有放入已编译的类文件中。在运行时,虚拟机没有可用的类型信息来检查列表的类型,因此不能通过
instanceof
检查它。您不能在instanceof
中使用泛型类型也就是说,您可以执行o instanceof List
,但不能执行o instanceof List
。这是因为Java在编译时擦除泛型类型信息
当然,您可能可以使用一个hack。如果您确定列表是非空且同质的(列表中的所有项都是相同类型且不为null),则不检查列表类型,而是检查其中一个项的类型
Object item = o.get(0);
if (item instanceof CheckinTemplate) {
} else if (item instanceof Employee) {
} else if (item instanceof Status) {
}
是
o
aList
?由于类型擦除,Java无法区分这些类型。o声明为对象,但初始化为列表中的任何一个。
Object item = o.get(0);
if (item instanceof CheckinTemplate) {
} else if (item instanceof Employee) {
} else if (item instanceof Status) {
}