List<Node> modelList = (List<Node>)List<IModel>;
其中Node是IModel的子类,为什么IModel的集合不能强转为Node的集合呀,请各位大侠帮忙。

解决方案 »

  1.   

    都说Node是IModel的子类,怎么能子类的引用指向父类的对象
      

  2.   

    复习一下泛型吧,List<Node>和List<IModel>是 List的子类,但是List<Node>和List<IModel>是没有继承关系的。
      

  3.   

    楼主怎么想我猜到了一点
    Node是IModel 的子类 我举个例子
    Node node =new Node()
    IModel imodel=(IModel )node;
    这样是可以的~~
    但是List<Node> list1 和  List<IModel>list2   之间是转换不了的因为 list1 和 list2 没有任何继承关系~
      

  4.   


    List<Node> modelList=new ArrayList<Node>();
    List<IModel> imodel=new ArrayList<IModel>();这是两个List,存放的是对两个类对象的引用,虽然存放的类型存在继承关系,但对List而言不是存在继承关系的。那也不不存在向上转型或向下转型的引用了。
      

  5.   

    Referring to a superclass object with a superclass reference is straightforward;
    Referring to a subclass object with a subclass reference is straightforward;
    Referring to a subclass with a superclass reference is safe;
    Referring to a superclass with a subclass reference is a syntax error.
      

  6.   

    你可以用List<? extends IModel> 或者 List<? super Node>但你要明确你的目的是什么
      

  7.   

    谢谢各位大侠的指点,我有些明白了,那样做确实不对,我的那个IModel是一个标识接口,里面没有定义任何属性和方法。
    List<IModel> 是由持久层public List<IModel> getModelList(String className)方法得到的,
    我需要的是List<Node>现在我需要把List<IModel>强制转换为List<Node>
    有一个办法是:for(IModel model:modelList){
                    Node node = (Node)model;
                    nodeList.add(node);
                }
    这样可以得到nodeList,但是我觉得这样很不好,太浪费资源。我觉得14楼的说法可行。
      

  8.   


    package generics;import java.util.ArrayList;
    import java.util.List;public class Generics extends GG{
    int k;
    public Generics(int k) {
    // TODO Auto-generated constructor stub
    this.k = k;
    }
    public static List<? extends GG> listCopy(List<GG> src){

    return src;
    }

    @SuppressWarnings({ "unchecked" })
    public static void main(String[] args) {
    List<GG> list = new ArrayList<GG>();
    list.add(new Generics(1));
    list.add(new Generics(2));
    list.add(new Generics(3));
    List<Generics> ll = (List<Generics>) listCopy(list);
    System.out.println(ll);


    List<Generics> lll = (List<Generics>)(List<? extends GG>)list; 
    System.out.println(lll);
    }

    public String toString(){
    return k+"";
    }
    }class GG{

    }
    打出GG,思密达