java特别基础之泛型

java特别基础之泛型

目的:面向对象对代码重用的支持,其中一个重要的机制就是泛型
泛型的使用方式
如果除去对象的基本类型以外,实现方法是相同的,那么就可以用泛型实现来描 述这种基本的功能
两个细节
1.使用时必须强转成正确的类型
2.不能使用基本类型,只有引用类型能与Object相容(但可以使用包装类)
自动装箱\拆箱
如果一个int型量被传递到需要一个Integer对象的地方,那么编译器将在幕后插入个对Integer构造方法的调用,即自动装箱
如果一个Integer对象被放到需要int型量的地方,则编译器将在幕后插入一个对intValue()方法的调用,即自动拆箱
IS-A关系
public static Comparable findMax(Comparable[] arr){
    int maxIndex = 0;

    for (int i = 1; i < arr.length; i++)
        if (arr[i].compareTo(arr[maxIndex]) > 0)
            maxIndex = i;

    return arr[maxIndex];
}
 
1.仅有compareTo方法但未宣称实现Comparable接口的对象不是Comparable的,他不具有IS-A关系
2.如果所传参数Comparable[]中存在不相容的对象,那么CompareTo()方法将抛出异常ClassCastException
3.基础类型能通过其包装类作为Comparable传递,因为包装类实现了Comparable
4.接口究竟是不是标准库的接口倒不是必需(意思是:泛型也对非标准java库接口适用!?)
5.方案不是总能行得通(之后有function 参数),如:包装类,但接口是用户自定义接口。又或者是个final类
协变数组类型
数组兼容对象的类型
(非协变)每个数组都明确它所允许存储的对象的类型
协变性解析
totalArea(Shape[] arr){} 此处用数组具有协变性
totalArea(Collection<Shape> arr){} 此处用集合协变性消失
totalArea(Collection<? extends Shape> arr){} 此处引入通配符重新使对象具有协变性
1.使类具有泛型
public class Tree <AnyType extends Comparable<? super AnyType>> {}
 
2.使某方法参数能使用泛型(不需要类是泛型):
    public static<AnyType> AnyType findMax(){ return val; }
类型界限
1.public static<AnyType extends Comparable>
AnyType findMax(AnyType[] arr){}
(1.写法不太好)
现在假设Square继承Shape,可得Square实现Comparable<Shape>,可得Square IS-A Comparable<Shape>,但是不能得到Square IS-A Comparable<Square>
2.public static<AnyType extends Comparable<? super AnyType>> AnyType findMax(AnyType[] arr){}
这是为了使用Compable接口中的compareTo()方法
 

猜你喜欢

转载自silverrye.iteye.com/blog/2384775