A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 冯越 于 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》关于泛型有一句话: 边界就是发生动作的地方。  这句话怎么理解?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
老兄 泛型式绝对有用的。第一个好处是编译时的严格类型检查。有效的避免了运行期的ClassCastException,提高了程序的安全性。这是集合框架最重要的特点。

此外,泛型避免了绝大多数的类型转换。如果没有泛型,当你使用集合框架时,你不得不进行类型转换。另外 泛型简化了代码,提高程序的可读性,更利于团队的合作开发。

举个例子来说
你的钱包里你规定只装钱,那么你去出来的想也不想就是钱,管他是¥还是$不用转换的-->都是钱(确定里面是什么)。不用泛型的话 就不规定放什么, 那么你取出来的东西就不一定是钱,这样你就要转换了,那要是石头的话你要转换成钱就错了(不确定里面到底是什么)。

之所以运行时擦出这些信息,原因很明显,那就是这些泛型的声明 都是给编程者和编译器看的。
回复 使用道具 举报
杨梦宇 发表于 2012-5-25 16:58
老兄 泛型式绝对有用的。第一个好处是编译时的严格类型检查。有效的避免了运行期的ClassCastException,提 ...

擦除并非如此简单,目的也不是那么浅浅。据我所知,sun之所以这么设计完全是逼不得已而为之,是为了向后兼容。所以,他是伪泛型,没有像c++中泛型那么强大。

点评

关于范型如果被引进,你可以去问问1.5时代之前的老程序员,他们是怎么实现集合无措使用的,那个时代就已经有自己的范型实现方法了  发表于 2012-5-26 21:53
回复 使用道具 举报
泛型好处主要有两点
1、省去了类型转换的麻烦
2、编译期远比运行时错误来的容易处理

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马