java 协变

  一个一直有点模糊的概念,记录一下,协变是指一个类型随着它关联的类型一起变化,有点抽像,java中体现协变的包括两点:

 

1.数组 

 

  如果 A 是 B 的超类,则 A[] 也是 B[] 的超类,所有需要 A[] 的地方都可以用 B[] 代替。 

 
public class Test2 {  
    public static void main(String[] args){  
        Integer[] ints=new Integer[1];  
        ints[0]=99;  
        show(ints);  
    }  
    static void show(Number[] ns){  
        System.out.println(Arrays.toString(ns));  
    }  
}  

 

 

2.override

 

允许 子类的覆盖父类函数的返回类型 是 父类被覆盖函数返回类型 的子类

 

 
public class Test2 {  
    public static void main(String[] args){  
        P p=new C();  
        System.out.println(p.get());  
    }  
}  
  
class P{  
    public Number get(){  
        return new Integer(0);  
    }  
}  
  
class C extends P{  
    public Integer get(){  
        return new Integer(1);  
    }  
}  

 

3.范型不能协变

 

如果 A 是 B 的超类,则 List<A> 和 List<B> 无关,需要 List<A> 的地方不可以用 List<B> 代替。

 

  
public class Test2 {  
    public static void main(String[] args) {  
        List<Integer> ints = new ArrayList<Integer>();  
        //incompatible type  
        show(ints);  
    }  
  
    static void show(List<Number> ns) {  
        System.out.println(ns);  
    }  
} 

 

 

 参考:http://yiminghe.iteye.com/blog/677332

posted @ 2013-06-03 17:21  nextnj  阅读(175)  评论(0)    收藏  举报