在Java中,为什么在无界通配符类型上允许instanceof运算符,而在其他参数化类型上不允许instanceof运算符?

在Java中,为什么在无界通配符类型上允许instanceof运算符,而在其他参数化类型上不允许instanceof运算符?,java,generics,Java,Generics,我认为由于参数化泛型类型不允许使用instanceof和类文本,除了无边界通配符类型。为什么Java语言设计人员允许这个异常?无界通配符类型没有类型擦除的作用?关键是对象知道它的具体类,但不知道它的泛型类型参数。因此,如果我们构造一个ArrayList,它在执行时知道它是某种ArrayList,但它不知道整数部分 “ArrayList某种类型”部分正是ArrayList的意思,这就是为什么: if (foo instanceof ArrayList<?>) 但是,编译器在运行时不是

我认为由于参数化泛型类型不允许使用
instanceof
类文本
,除了
无边界通配符类型
。为什么Java语言设计人员允许这个异常?无界通配符类型没有类型擦除的作用?

关键是对象知道它的具体类,但不知道它的泛型类型参数。因此,如果我们构造一个
ArrayList
,它在执行时知道它是某种
ArrayList
,但它不知道
整数部分

ArrayList
某种类型”部分正是
ArrayList
的意思,这就是为什么:

if (foo instanceof ArrayList<?>)

但是,编译器在运行时不是有元数据可以说
字段foo
ArrayList
类型吗?我指的是@Geek:是的,但那是一个字段,不是一个对象。它们不同。为什么检查
ArrayList
与使用原始类型
ArrayList
相同?前者使用通配符,是“任何内容的列表”,而后者忽略类型参数,只是一个“列表”。他们怎么会是同一件事?@FrancescoMenzani:老实说,我不知道为什么允许这样做。也许是为了让你清楚地知道这是你测试的泛型类型?
if (foo instanceof ArrayList)