论坛首页 Java企业应用论坛

Java程序员都不学泛型的啊,为什么这个错误都没人提

浏览 5903 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-07-01   最后修改:2012-07-01
Thinking In Java 第四版,393,作者说:
引用

但是,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(); }
} ///:~
   发表时间:2012-07-01  
1. 我不喜欢这个书,无意义的语法细节。用中文说就是和狗屎一样。(不要和我争辩,我不喜欢这个作者的每一本书,他就是个骗子。完毕)

2. Java的泛型本来就是“无意义”的,它的实现也是比较搞笑的,就是在编译的时候“查找”替换T为某个类型。所以你可以看到它的泛型有多烂。

3. 你说的这个问题的本质在用,Java的泛型很烂即上面说的查找替换实现。你不必和那本书的作者一样去追求“毫无规律”的规律。
0 请登录后投票
   发表时间:2012-07-02  
fireflyc 写道
1. 我不喜欢这个书,无意义的语法细节。用中文说就是和狗屎一样。(不要和我争辩,我不喜欢这个作者的每一本书,他就是个骗子。完毕)

2. Java的泛型本来就是“无意义”的,它的实现也是比较搞笑的,就是在编译的时候“查找”替换T为某个类型。所以你可以看到它的泛型有多烂。

3. 你说的这个问题的本质在用,Java的泛型很烂即上面说的查找替换实现。你不必和那本书的作者一样去追求“毫无规律”的规律。

啊,您这有点过了吧,我觉得TIJ这本书相当经典

坦白讲,平时工作中我也不用泛型,但作为 JDK5 引入的语法,如果现在再不学学,JDK7都出来了,直接落后2个版本,差的太多了,哈哈

Effective Java也花大部分篇幅讲解这玩意,不可能“无意义”的吧
0 请登录后投票
   发表时间:2012-07-02  
无意义吗?
我们用的挺多也很方便啊
0 请登录后投票
   发表时间:2012-07-02  
fireflyc 写道
1. 我不喜欢这个书,无意义的语法细节。用中文说就是和狗屎一样。(不要和我争辩,我不喜欢这个作者的每一本书,他就是个骗子。完毕)

2. Java的泛型本来就是“无意义”的,它的实现也是比较搞笑的,就是在编译的时候“查找”替换T为某个类型。所以你可以看到它的泛型有多烂。

3. 你说的这个问题的本质在用,Java的泛型很烂即上面说的查找替换实现。你不必和那本书的作者一样去追求“毫无规律”的规律。


thinking in java是我最喜欢的java基础书,没有之一。
0 请登录后投票
   发表时间:2012-07-02   最后修改:2012-07-02
我认为泛型对开发有意义,
对设计的意义几乎为0.
..
规约限制的逻辑太难以理解了.

只是把运行时异常变成编译异常......
0 请登录后投票
   发表时间:2012-07-02  
抛出异常的爱 写道
我认为泛型对开发有意义,
对设计的意义几乎为0.
..
规约限制的逻辑太难以理解了.

只是把运行时异常变成编译异常......



对的,java的泛型只是省去了类型转换而已。所以我才说,比起C++而言java泛型的意义不大,根本就是一种“纯商业”行为的“特性”。
0 请登录后投票
   发表时间:2012-07-02  
Thinking In Java 这本书确实够差的,死抠一辈子也不用的细节
0 请登录后投票
   发表时间:2012-07-02  
fireflyc 写道
1. 我不喜欢这个书,无意义的语法细节。用中文说就是和狗屎一样。(不要和我争辩,我不喜欢这个作者的每一本书,他就是个骗子。完毕)

2. Java的泛型本来就是“无意义”的,它的实现也是比较搞笑的,就是在编译的时候“查找”替换T为某个类型。所以你可以看到它的泛型有多烂。

3. 你说的这个问题的本质在用,Java的泛型很烂即上面说的查找替换实现。你不必和那本书的作者一样去追求“毫无规律”的规律。


如果你仅把这本书当语法参考来看,那你完全就是个门外汉了!
0 请登录后投票
   发表时间: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不适合那些只想知道答案的人看.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics