14.2.2泛化的java引用

来源:互联网 发布:unity3d 骨骼动画 编辑:程序博客网 时间:2024/06/05 10:32

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 blockthrow 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 {}


0 0