今天看了Java泛型 类型擦除的部分 自己动手写了一些测试的程序 但这个总是没法理解
import java.util.*;
public class Test2 {
public static void main(String[] args) {
List<A> la = new ArrayList<A>();
la.add(new A());
Object o = la;
List<Date> ld = (List<Date>)o;
System.out.println(ld.get(0));
List<String> ls = (List<String>)o;
System.out.println(ls.get(0));
}
}
class A {
public String toString() { return "A"; }
}编译没问题 但运行时在Line10行抛出一个ClassCastException
说是A cannot be cast to java.lang.String这个我感觉应该没错 无论是la还是ld跟ls 其实都是一个ArrayList对象(擦除了类型的)
在将new A()放入la时,自动变成Object引用
然后再调用ls.get(0)时,将Object转型为String时,转型错误抛出异常
....但是纳闷的是第七行和第八行 程序在这里很正常地运行了 也输出了一个字符串"A"
A类和Date类的关系应该跟A类和String类的关系一样吧 除了继承自Object类就没有交集了
但是在这里却得到两种不同的结果 不明白是怎么一回事 敬请大虾解谜!Java泛型

解决方案 »

  1.   

    这个应该是这样的,那个println接收的参数是String类型的,第一个Date不是String类型的,自动调用对象的toString方法,第二个从list中get出来的就是String类型,虚拟机就执行转换就出错了....
      

  2.   

    是的是的 
    第一个调用的是PrintStream.println(Object x)
    第二个是PrintStream.println(String s)
    在eclipse中把鼠标放到println方法上就能看到具体调用的是哪一个了万分感谢!!!!
      

  3.   

    这就好比:
    A a = new A();
    String str = (String) a;
    两个不同的类,无法强转的亲。一般用强转会在,存在父类子类关系上的对象上执行,比如B extends A:
    A ab = new B();
    B b = (B)ab;这样才可以的。
      

  4.   

    发现把那个String的泛型改成Integer就可以了,为什么会这样。。
      

  5.   


    //这里明确了list中的对象为A的实例
    List<A> la = new ArrayList<A>();
            la.add(new A());
    //list是Object的的子类,所以可以制动转换类型。
            Object o = la;
    //虽然上面的list被转换成了object,即被抽象成了它的父类Object类型,list原有属性和方法不能再通过原有方法访问,但这些属性行为并没有丢失,它仍然可以被转换回原来的list<A>对象或list<? extends A>其父类对象。
            List<Date> ld = (List<Date>)o;
            System.out.println(ld.get(0));
            List<String> ls = (List<String>)o;
            System.out.println(ls.get(0));lz要明确List<Date>、List<A>、List<String>这些list中存放的对象是不同类型的,且没有子父关系,是不能直接强制转换的。