下面代码中如何用泛型实现 “编译出错”问题。
也就是实现注释“不用泛型”下面的代码?
谢谢各位import java.util.ArrayList;
import java.util.List;
public class Fanxing {
public static void main(String[] args) {
List<A> listA = new ArrayList<A>();
listA.add(new C());
listA.add(new C());
listA.add(new C());
listA.add(new C());
// List<C> listC = (List<C>)listA;  //编译出错。
// List<C> listC = (C)listA; //编译出错
// List<C> listC = listA; //编译出错
/***** 不用泛型  ****/
List<C> listC = new ArrayList<C>();
for(A a:listA){
listC.add((C)a);
}
}
}
class A {
}
class E {
}
class B extends A {
}
class C extends A {
}

解决方案 »

  1.   

    /*****        不用泛型  ****/
            List<C> listC = new ArrayList<C>();
            for(A a:listA){
                listC.add((C)a);
            } 这段代码用了泛型 怎么能说没用泛型你编译出错时因为的C类是继承A类的,那么C的范围肯定或至少要比A大,添加泛型的时候,就不允许你向下转型
      

  2.   

    你编译出错时因为的C类是继承A类的,那么C的范围肯定或至少要比A大,添加泛型的时候,就不允许你向下转型
      

  3.   

    泛型没有子类和父类之分,List<C>与List<A>没关系,怎么可能相互转化啊,不出错才怪呢。它们唯一的关系就是在泛型擦除之后都是List类型。
      

  4.   

    泛型是没有父子类之分, 但是里面装的对象是可以的. 比方说:
    List<A> listA = new ArrayList<A>();
    List<C> listC = new ArrayList<C>();
    for(C c: listC){
    listA.add(c);
    }
    在向listA中添加对象时,会自动向上转型.反之,则需要强转了.
      

  5.   

    用reflection 应该可以实现
      

  6.   


    如果要强转存在一个效率问题。如果listA 集合存了较大的数据量,但明确存放的子类是什么。比如明确存放了C子类。
    先将listA 强转成listC,如果一个一个拿出来循环强转。。势必影响到效率
      

  7.   

    楼主,listA怎么强转成listC啊?请多指教。最好附源码!!!
      

  8.   

    说的简单一点:String是Object的子类,但是ArrayList<String>就不一定是ArrayList<Object>的子类了。看个很简单的小测试:import java.util.ArrayList;
    import java.util.List;public class TestGen {
        
        public static void main(String[] args){
            //创建一个List<String>对象
            List<String> strList=new ArrayList<String>();
            //将strList作为参数来调用test()方法
            TestGen.test(strList);//①
        }
        
        public static void test(List<Object> c){
            for(int i=0;i<c.size();i++){
                System.out.println(c.get(i));
            }
        }
    }编译上面的程序,将在①处发生错误:无法将Test中的test(java.util.List <java.lang.Object>)应用于(java.util.List <java.lang.String>) 
    错误信息告诉我们:虽然String是Object的子类,但是List <String>类并不是List <Object>的子类,也就是说List <String>对象不能当成List <Object>对象使用
      

  9.   

    java编程时最好不要用泛型,这个不是sun公司java的强项,它并不好用
      

  10.   


    我明白大家的意思简单说就是listA中既可以存放B对象也可以存放C对象。直接强转成listC 是不可以的。但如果明确了listA中存放的都是C得对象。现需要将listA转成listC 怎么来实现呢?
    eg。主题中的方法,遍历listA然后对每一个对象进行强转 再放进listC中方法。
    但 如果listA中的数据量很大时,势必产生效率上的问题。
    大家有什么好的办法么
      

  11.   

    支持,不过谁能解释一下LIst<String> 和list<object>之间的关系那?貌似他们之间没什么关系吧!请高手指点
      

  12.   

    任何对象都是继承Object类的,如果可以向下转型的话,就是可以将listObject转化成任何类了。
    类比一下
    所以ListA是不能向下转化为ListC的
      

  13.   

    //        List<C> listC = (List<C>)listA;     //编译出错。
    //        List<C> listC = (C)listA;        //编译出错
    //        List<C> listC = listA;        //编译出错和泛型没有关系,是塑形时父类不能强制塑形为子类,但反向是可以的