Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取“;instanceof”;的泛型类型非法;共乘错误_Java_Android - Fatal编程技术网

Java 获取“;instanceof”;的泛型类型非法;共乘错误

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,但在编译过程中会删除泛型类型参数。这意味着在运

在我的代码中有3个自定义类

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
a
List
?由于类型擦除,Java无法区分这些类型。o声明为对象,但初始化为列表中的任何一个。
Object item = o.get(0);
if (item instanceof CheckinTemplate) {
} else if (item instanceof Employee) {
} else if (item instanceof Status) {
}