泛型与Class类

1 使用Class<T>泛型可以避免强制类型转换
2 String.class的类型实际上是Class<String>
3 如果Class对应的类暂时未知,就用Class<?>
//不用泛型的demo
public class ObjectFactory {
    public static Object getInstance(String name){
        try {
            Class cls = Class.forName(name);
            return cls.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        } catch (InstantiationException e) {
            e.printStackTrace();
            return null;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return null;
        }
    }
}



public class Test extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    //需要强制类型转换
        Date date = (Date) ObjectFactory.getInstance("java.util.Date");


    }
}
//使用泛型的demo
public class ObjectFactory2 {
//注意泛型的写法,在方法中将返回类型Object变成<T> T
    public static <T> T getInstance(Class<T> cls){


        try {
            return cls.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
            return null;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return null;
        }

    }
}


public class Test extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //不需要强制转换
        Date d  = ObjectFactory2.getInstance(Date.class);
    }
}
//ex:Array
//使用Array类创建数组
Object arr = Array.newInstance(String.class,10);
//Array的newInstance()方法签名
public static Object newInstance(Class<?> componentType,int... dimensions)
//如果改成下面就可以使用泛型
public static <T> T newInstance(Class<T> componentType,int length)

public class ArrayFactory {
    public static <T> T[] newInstance(Class<T> componentType, int length){
        return (T[]) Array.newInstance(componentType,length);
    }
}

public class Test extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //一维
        String[] strings = ArrayFactory.newInstance(String.class,5);
        strings[0] = "疯狂java讲义";
        //二维
        int[][] ints = ArrayFactory.newInstance(int[].class,10);
        ints[1] = new int[]{22,33};
        Log.d("shj--","str "+strings[0]+" ints "+ints[1].toString());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章