Java泛型中擦除的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CmdSmith/article/details/74941105

摘自Java编程思想


擦除使得现有的非泛型客户端代码能够在不改变的情况下继续使用,直至客户端准备好用泛型重写这些代码。


擦除的代价是显著的。泛型不能用于显式地引用运行时类型的操作之中,例如转型、instanceof操作和new表达式。

因为所有关于参数的类型信息都丢失了,无论何时,当你在编写泛型代码时,必须时刻提醒自己,你只是看起来好像拥有有关参数的类型信息而已。因此,如果你编写了下面这样的代码段:

class Foo<T> {
    T var;
}
那么,看起来当你在创建Foo的实例时:

Foo<Cat> f = new Foo<Cat>();
class Foo 中的代码应该知道现在工作于Cat之上,而泛型语法也在强烈暗示:在整个类中的各个地方,类型T都在被替换。

但事实并非如此,当你在编写这个类的代码时,必须提醒自己:“不,它只是一个Object”。


擦除和迁移兼容性意味着,使用泛型并不是强制的。


猜你喜欢

转载自blog.csdn.net/CmdSmith/article/details/74941105