黑马程序员技术交流社区
标题:
关于运行中擦除泛型信息的不解(回答令人不太满意啊~)
[打印本页]
作者:
冯越
时间:
2012-5-25 16:52
标题:
关于运行中擦除泛型信息的不解(回答令人不太满意啊~)
本帖最后由 冯越 于 2012-5-25 17:19 编辑
本来我以为泛型是属于java里比较简单的部分。但现在我才知道我大错特错了,越往后学越觉得水深,泛型还真不简单,这下可好脑袋现在全蒙了。废话不多说现在我来说下我的疑问,还望高手们能透彻的帮我分析一下。
大家都知道java中的泛型和c++等其他语言相比,并不是真正的泛型,我们更愿意把它叫做伪泛型。因为它只存在与编译阶段,运行阶段是没有所谓泛型的讯息的,所有的泛型信息都被擦除了。泛型类相比大家也用过不少了,那现在问题来了。
如果我们编写了这样的代码:
class Foo<T> {
T var;
}
那么,当我们创建一个Foo对象, Foo<Cat> f = Foo<Cat>(); class Foo中的代码应该知道现在工作于Cat之上,而泛型语法也在强烈暗示着:在整个类中的各个部分类型T都被替换成了Cat。但是事实并非如此,因为运行时泛型的信息都被擦除了,所我我们new出来的Foo对象里 T的类型应该是 Object 而不是 Cat。现在我们再new一个实例出来 Foo<Dog> f = Foo<Dog>(); 同样的 我们new出来的Foo对象里 T的类型也是 Object 而不是 Dog。 也就是说 我们所new出来的这两个实例对象其在内存内部是完全一样的。那我们在这里用泛型的意义又是什么呢? 也就是说 泛型类 还有什么意义呢?
再补充一句,《Thinking in java》关于泛型有一句话: 边界就是发生动作的地方。 这句话怎么理解?
作者:
杨梦宇
时间:
2012-5-25 16:58
老兄 泛型式绝对有用的。第一个好处是编译时的严格类型检查。有效的避免了运行期的ClassCastException,提高了程序的安全性。这是集合框架最重要的特点。
此外,泛型避免了绝大多数的类型转换。如果没有泛型,当你使用集合框架时,你不得不进行类型转换。另外 泛型简化了代码,提高程序的可读性,更利于团队的合作开发。
举个例子来说
你的钱包里你规定只装钱,那么你去出来的想也不想就是钱,管他是¥还是$不用转换的-->都是钱(确定里面是什么)。不用泛型的话 就不规定放什么, 那么你取出来的东西就不一定是钱,这样你就要转换了,那要是石头的话你要转换成钱就错了(不确定里面到底是什么)。
之所以运行时擦出这些信息,原因很明显,那就是这些泛型的声明 都是给编程者和编译器看的。
作者:
冯越
时间:
2012-5-25 17:02
杨梦宇 发表于 2012-5-25 16:58
老兄 泛型式绝对有用的。第一个好处是编译时的严格类型检查。有效的避免了运行期的ClassCastException,提 ...
擦除并非如此简单,目的也不是那么浅浅。据我所知,sun之所以这么设计完全是逼不得已而为之,是为了向后兼容。所以,他是伪泛型,没有像c++中泛型那么强大。
作者:
张晨
时间:
2012-5-25 17:06
泛型好处主要有两点
1、省去了类型转换的麻烦
2、编译期远比运行时错误来的容易处理
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2