`
spitcold
  • 浏览: 8896 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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

阅读更多
//: 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中把出错行..的那行取消注释,可以正常编译运行。请问是什么道理
分享到:
评论
5 楼 iceman1952 2012-07-01  
wu19880125 写道
lz,我觉得你看书的时候应该仔细点,仔细看393行的倒数第二行
作者知道可以,但是这是违反静态类型安全的!你应该仔细琢磨作者的书哈!!!

wu19880125 写道
还有,不要动不动就说是个错误,免得误人子弟!

楼主理解的没错,这个地方就是错误。
“作者知道可以,但是这是违反静态类型安全的!”请问,你怎么看出这点的?作者在说“这是违反静态类型安全的”指的是向 List<? super Apple>中加入Fruit是违反静态类型安全的
4 楼 wu19880125 2008-08-25  
还有,不要动不动就说是个错误,免得误人子弟!
3 楼 wu19880125 2008-08-25  
lz,我觉得你看书的时候应该仔细点,仔细看393行的倒数第二行
作者知道可以,但是这是违反静态类型安全的!你应该仔细琢磨作者的书哈!!!
2 楼 lovezqw 2008-02-26  
List<? super T> list, list可以使用add方法的

List<? extends T> list, 则list不可以使用add方法,只能查询~
1 楼 movingboy 2008-02-26  
如果文章的代码确实是你贴出来的那样,那确实是个错误。
你查一下该书的勘误,看看这个错误是否已经纠正了?
还有你查一下作者写这本书时使用的编译器是不是比较老了?

相关推荐

Global site tag (gtag.js) - Google Analytics