摘自Java编程思想
擦除使得现有的非泛型客户端代码能够在不改变的情况下继续使用,直至客户端准备好用泛型重写这些代码。
擦除的代价是显著的。泛型不能用于显式地引用运行时类型的操作之中,例如转型、instanceof操作和new表达式。
因为所有关于参数的类型信息都丢失了,无论何时,当你在编写泛型代码时,必须时刻提醒自己,你只是看起来好像拥有有关参数的类型信息而已。因此,如果你编写了下面这样的代码段:
class Foo<T> {
T var;
}
那么,看起来当你在创建Foo的实例时:
Foo<Cat> f = new Foo<Cat>();
class Foo 中的代码应该知道现在工作于Cat之上,而泛型语法也在强烈暗示:在整个类中的各个地方,类型T都在被替换。
但事实并非如此,当你在编写这个类的代码时,必须提醒自己:“不,它只是一个Object”。
擦除和迁移兼容性意味着,使用泛型并不是强制的。