精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-07-01
最后修改:2012-07-01
引用 但是,writeExact()不允许将 Apple 放置到 List<Fruit> 中,即使知道这应该是可以的。 这里是错误的。对于这条语句,别说错误,编译器连警告都没发出。 书中这么明显的错误,为什么没人提呢?网上搜了搜,只有 iteye 上有两个帖子谈到这个,但是,也没答案。搜到个英文的,里面也同意作者错误。http://www.coderanch.com/t/381238/java/java/Generics-type-argument-inference 所以,我觉得java程序员是不是都不用泛型的啊,如果认真看,怎么会发现不了这个错误? 被注释掉的这句很明显没有任何问题嘛 // writeExact(fruit, new Apple()); // Error: // Incompatible types: found Fruit, required Apple 书中代码是这样的: class Fruit {} class Apple extends Fruit {} class Jonathan extends Apple {} public class GenericWriting { static <T> void writeExact(List<T> list, T item) { list.add(item); } static List<Apple> apples = new ArrayList<Apple>(); static List<Fruit> fruit = new ArrayList<Fruit>(); static void f1() { writeExact(apples, new Apple()); // writeExact(fruit, new Apple()); // Error: // Incompatible types: found Fruit, required Apple } static <T> void writeWithWildcard(List<? super T> list, T item) { list.add(item); } static void f2() { writeWithWildcard(apples, new Apple()); writeWithWildcard(fruit, new Apple()); } public static void main(String[] args) { f1(); f2(); } } ///:~ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-07-01
1. 我不喜欢这个书,无意义的语法细节。用中文说就是和狗屎一样。(不要和我争辩,我不喜欢这个作者的每一本书,他就是个骗子。完毕)
2. Java的泛型本来就是“无意义”的,它的实现也是比较搞笑的,就是在编译的时候“查找”替换T为某个类型。所以你可以看到它的泛型有多烂。 3. 你说的这个问题的本质在用,Java的泛型很烂即上面说的查找替换实现。你不必和那本书的作者一样去追求“毫无规律”的规律。 |
|
返回顶楼 | |
发表时间:2012-07-02
fireflyc 写道 1. 我不喜欢这个书,无意义的语法细节。用中文说就是和狗屎一样。(不要和我争辩,我不喜欢这个作者的每一本书,他就是个骗子。完毕) 2. Java的泛型本来就是“无意义”的,它的实现也是比较搞笑的,就是在编译的时候“查找”替换T为某个类型。所以你可以看到它的泛型有多烂。 3. 你说的这个问题的本质在用,Java的泛型很烂即上面说的查找替换实现。你不必和那本书的作者一样去追求“毫无规律”的规律。 啊,您这有点过了吧,我觉得TIJ这本书相当经典 坦白讲,平时工作中我也不用泛型,但作为 JDK5 引入的语法,如果现在再不学学,JDK7都出来了,直接落后2个版本,差的太多了,哈哈 Effective Java也花大部分篇幅讲解这玩意,不可能“无意义”的吧 |
|
返回顶楼 | |
发表时间:2012-07-02
无意义吗?
我们用的挺多也很方便啊 |
|
返回顶楼 | |
发表时间:2012-07-02
fireflyc 写道 1. 我不喜欢这个书,无意义的语法细节。用中文说就是和狗屎一样。(不要和我争辩,我不喜欢这个作者的每一本书,他就是个骗子。完毕)
2. Java的泛型本来就是“无意义”的,它的实现也是比较搞笑的,就是在编译的时候“查找”替换T为某个类型。所以你可以看到它的泛型有多烂。 3. 你说的这个问题的本质在用,Java的泛型很烂即上面说的查找替换实现。你不必和那本书的作者一样去追求“毫无规律”的规律。 thinking in java是我最喜欢的java基础书,没有之一。 |
|
返回顶楼 | |
发表时间:2012-07-02
最后修改:2012-07-02
我认为泛型对开发有意义,
对设计的意义几乎为0. .. 规约限制的逻辑太难以理解了. 只是把运行时异常变成编译异常...... |
|
返回顶楼 | |
发表时间:2012-07-02
抛出异常的爱 写道 我认为泛型对开发有意义,
对设计的意义几乎为0. .. 规约限制的逻辑太难以理解了. 只是把运行时异常变成编译异常...... 对的,java的泛型只是省去了类型转换而已。所以我才说,比起C++而言java泛型的意义不大,根本就是一种“纯商业”行为的“特性”。 |
|
返回顶楼 | |
发表时间:2012-07-02
Thinking In Java 这本书确实够差的,死抠一辈子也不用的细节
|
|
返回顶楼 | |
发表时间:2012-07-02
fireflyc 写道 1. 我不喜欢这个书,无意义的语法细节。用中文说就是和狗屎一样。(不要和我争辩,我不喜欢这个作者的每一本书,他就是个骗子。完毕)
2. Java的泛型本来就是“无意义”的,它的实现也是比较搞笑的,就是在编译的时候“查找”替换T为某个类型。所以你可以看到它的泛型有多烂。 3. 你说的这个问题的本质在用,Java的泛型很烂即上面说的查找替换实现。你不必和那本书的作者一样去追求“毫无规律”的规律。 如果你仅把这本书当语法参考来看,那你完全就是个门外汉了! |
|
返回顶楼 | |
发表时间:2012-07-02
1. JSR14 也就是泛型的规范 从设计到实现 应该变动过几次, 我记得我原来看过侯捷写的泛型文章, 跟JDK中的泛型也是有一定的差异
2. 如果把方法改成带返回参数,并且得到返回值,就会编译错误 static <T> T writeExact( List<T> list, T item ) { list.add( item ); return item; } ........ Apple a2 = writeExact( fruit, new Apple() ); //Error 3. 你若明白泛型的原理,也就明白为什么没有返回参数, 或者不取返回值,不会编译错误.就好像HTML浏览器在解释各种不规范的HTML时,往往大部分能正确显示. 毕竟java对程序员的要求很低. 4. TIJ不适合那些只想知道答案的人看. |
|
返回顶楼 | |