14.2.2泛化的java引用

P353

Class引用是指向某个类型的Class对象, 在具体使用中, 为了避免无意中的错误类型替换, 可以使用模板来进一步约束Class的使用.

package com.cnsuning.src;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {
		ListFill<MyInteger> lFill = new ListFill<MyInteger>(MyInteger.class);
		System.out.println(lFill.fillList(10));
	}
}

class ListFill<T> {
	private Class<T> type;

	public ListFill(Class<T> type) {
		this.type = type;
	}

	public ArrayList<T> fillList(int size) {
		ArrayList<T> list = new ArrayList<T>();
		try {
			for (int i = 0; i < size; i++) {
				list.add(type.newInstance());
			}
		} catch (InstantiationException | IllegalAccessException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
		return list;
	}
}

class MyInteger{
	private static int count=0;
	private int id = ++count;
	public String toString(){
		return Integer.toString(id);
	}
}

输出

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

对不想限定类型的Class声明可以使用Class<?>的形式说明在这里你要用一个比较宽泛的Class引用.

PS: 值得注意的是, Class对象的newInstance()方法调用的前提是该类型的类有一个默认构造函数(无参构造函数)


除了上边展示的, Class用模板限定类型时还可以指定继承关系, 如<? extends father>或<? super child>, 具体见下边代码

package com.cnsuning.src;

public class Main {

	public static void main(String[] args) {
		//子类模板用法
		Class<? extends A> aChild = B.class;
		aChild = C.class; // 子类
		aChild = D.class; // 子类的子类
		aChild = A.class; // 自身
		// 这里显示模板提供的编译时类型检查
		// !aChild = E.class;
		//父类模板用法
		Class<? super B> bSuper = A.class;
		Class<B> bClass = B.class;
		bSuper = bClass.getSuperclass();
		//虽然JAVA中无多继承, 在这里可以确定B的父类就是A,但依然不能这样明确指定模板类型
//		Class<A> aClass = bClass.getSuperclass();
	}
}

class A {

}

class B extends A {

}

class C extends A {

}

class D extends B {

}

class E {

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值