这是think in java上的一段话:当从容器中取出元素时--实际上容器对象将所有的事物都当作Object持有--会自动将结果转型回Shape"将所有的事物都当作Object持有"该怎么理解 我明明是将Shape对象和其子类对象放进去的啊 
另外我有一个疑问:
如果编译器可以使用泛型处理机制保证容器元素的正确 那么编译器就知道放入的是什么类型的对象  怎么还会将这些对象当成Object型呢这是我的朋友的回答 我认为是正确的 和think in java相合 但我看不大明白:泛型没出现之前都是当 Object 往 List 里装的,出现泛型后为了使老 Java 程序也能在新 JVM 上运行,所以 JVM 并没有变,变的是编译时多了些自动化的泛型用法处理

解决方案 »

  1.   

    "将所有的事物都当作Object持有"该怎么理解 所有的对象都是Object继承来的,容器是存放对象的,但是却不知道会存些什么对象,所以就以所有对象的祖先来代替
    ,...............如果编译器可以使用泛型处理机制保证容器元素的正确 那么编译器就知道放入的是什么类型的对象  怎么还会将这些对象当成Object型呢 这个我不知道怎么回答,我想会自动转成  Shape,是因为你已经在定义这人list时已经确定了,他只能存放Shape类吧
      

  2.   

    泛型没出现之前都是当 Object 往 List 里装的,出现泛型后为了使老 Java 程序也能在新 JVM 上运行,所以 JVM 并没有变,变的是编译时多了些自动化的泛型用法处理应该是指在用javac.exe进行编译生成.class文件前就已经做了处理.
    所以即使.java文件里用旧的写法使用容器,但编译后的.class文件已经是按新的规格生成的文件.即:
    旧写法/新写法--->同样规格的.class文件--->新的JVM可运行通过关键处理是在编译时候做的统一
      

  3.   

    对容器类型来说,泛型只是让编译器可以直接发现问题,杜绝不合法的类型转换。在不使用泛型的时候,对象的强制转换如果是不合法的,只有运行的时候才能发现错误。现在只是用起来更方便了。本质上没有多大的变化,jvm还是按原来的处理方式。
      

  4.   

    使用泛型和不使用泛型从 JVM 的角度看基本没变化(实际为了支持一些非常不常用的高级泛型用法 JVM 还是有一点可以忽略的变化的),编译器在编译时会自动加入强制类型转换的代码来减轻我们的工作量(少了一大堆强制类型转换的括号何类型名)。
      

  5.   

    所有的对象都是Object继承来的
    jvm研究研究
      

  6.   

    JAVA的范型是强行塞进去的.在1.5之前并没有范型这个概念.所以JAVA的范型很有"个性".其中一个就是JAVA范型在编译后全部为Object.
      

  7.   

    你可以使用 javap -c 查看一个编译过的范型类的class文件.看一下就很明白了.