论坛首页 入门技术论坛

thinking in java中的一个泛型错误,谁能解释一下

浏览 2589 次
该帖已经被评为新手帖
作者 正文
   发表时间:2008-02-26  
//: generics/GenericWriting.java
import java.util.*;

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(); }
    } ///:~

以上是书中源代码。作者认为出错行的理由是fruit是ArrayList<Fruit>(),里面不能放Fruit的任何子类对象,但是:
我在eclipse中把出错行..的那行取消注释,可以正常编译运行。请问是什么道理
   发表时间:2008-02-26  
如果文章的代码确实是你贴出来的那样,那确实是个错误。
你查一下该书的勘误,看看这个错误是否已经纠正了?
还有你查一下作者写这本书时使用的编译器是不是比较老了?
0 请登录后投票
   发表时间:2008-02-26  
List<? super T> list, list可以使用add方法的

List<? extends T> list, 则list不可以使用add方法,只能查询~
0 请登录后投票
   发表时间:2008-08-25  
lz,我觉得你看书的时候应该仔细点,仔细看393行的倒数第二行
作者知道可以,但是这是违反静态类型安全的!你应该仔细琢磨作者的书哈!!!
0 请登录后投票
   发表时间:2008-08-25  
还有,不要动不动就说是个错误,免得误人子弟!
0 请登录后投票
论坛首页 入门技术版

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