为什么instanceof运算符允许使用无界外卡类型而不允许使用Java中的其他参数化类型?

我认为由于类型擦除 ,除了unbounded wild card types之外, parameterized generic types不允许使用instanceofclass literals 。 为什么Java语言设计者允许这种exception? 对于无界外卡类型,没有类型擦除的任何作用?

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

ArrayList of some kind”部分正是ArrayList意思,这就是为什么:

 if (foo instanceof ArrayList) 

已validation。 它只相当于使用原始类型:

 if (foo instanceof ArrayList)