泛型與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());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章