Java核心技术(第8版) – 读书笔记 – 第12章

1、JDK5之后支持了泛型,类似C++的模板。

ArrayList<String> list = new ArrayList<String>();

2、一个简单的泛型类
一般通用类型表示如下:
(1)用E表示集合中的元素类型
(2)用K和V表示关键字与值类型
(3)用T、U、S表示任意类型

public class Pair<T, U>
{
	public Pair()
	{

	}

	public Pair(T first, U second)
	{
		this.first = first;
		this.second = second;
	}

	public T getFirst()
	{
		return first;
	}

	public U getSecond()
	{
		return second;
	}

	public void setFirst(T newFirst)
	{
		this.first = newFirst;
	}

	public void setSecond(U newSecond)
	{
		second = newSecond;
	}

	private T first = null;

	private U second = null;

	public static void main(String [] args)
	{
		//泛型中,int等基础类型不能用,需要改用Integer等包装类
		Pair<String, Integer> pair1 = new Pair<String, Integer>();
		pair1.setFirst(new String("first"));
		pair1.setSecond(111);
		Pair<Integer, Double> pair2 = new Pair<Integer, Double>();
		pair2.setFirst(222);
		pair2.setSecond(1.1);
		System.out.println("First:"+pair1.getFirst()+"\t"+pair1.getSecond());
		System.out.println("Second:"+pair2.getFirst()+"\t"+pair2.getSecond());
	}
}

3、还可以只针对某个方法定义泛型方法:

class ArrayArg
{
    public static <T> T getMiddle(T[] arr)
    {   
        return arr[arr.length / 2]; 
    }  
}

对于T,还可以限定它必须继承自(或者实现自XX),例如用于比较时:

public class ArrayArg
{
    //尽管Comparable是接口,但依然要用extends
    public static <T extends Comparable> T min(T[] arr)
    {
        T min = arr[0];
        for(int i=1; i<arr.length; i++)
        {
            if(arr[i].compareTo(min)<0)
            {
                min = arr[i];
            }
        }
        return min;
    }

    public static void main(String [] args)
    {
        Integer [] a = {1,2,3,4,5};
        Integer min = ArrayArg.min(a);
        System.out.println(min);
    }
}

4、为了更好的支持泛型类,JDK5与之前的字节码文件不兼容!

5、在对泛型源代码翻译字节码时,要做类型擦除:擦除类型变量(T等),并用应该使用的类型替换。对于无类型(非T,已经定义的),用Object替换,然后在调用出口时再强制转换回原始的未限定类型。

6、泛型的限制:
(1)基本类型不能用于泛型类型,如int、double,请用对应的Integer/Double等替换。
(2)a instanceof Pair<T> 将始终为真! 表示测试T是否为任意类型T的Pair
(3) 不能在catch中使用类型T
(4)不能声明参数化类型的数组,即
Pair<String>  table  = new Pair<String>[0]; // 非法
如果一定要用,可以用ArrayList:
ArrayList<Pair<String>>  table = …. // 正确!
(5)不能直接实例化 T
T a = new T(); //非法
(6)还有其他一些情况,比较复杂,基本和擦除相关。

7、泛型类中T的继承关系:尽管Manager是Employee的子类,但是Pair<Manager>不是Pair<Employee>的子类。可以继承Pair实现XXPair,XXPair是Pair的子类,但XXPair<Manager>也不是Pair<Manager>的子类!

8、为了解决上述问题,引入了问号?
Pair<? extends Employee>,它的类型是任意Employee的子类。
Pair<? super Employee>,它的类型是任意Employee的超类。

本章完,读的很不细,该天重新来过。

 

Leave a Reply

Your email address will not be published.