什么是泛型?
泛型,即“參數化類型”。顧名思義,就是將類型由原來的具體的類型參數化,類似於方法中的變量參數,此時類型也定義成參數形式(可以稱之為類型形參),然后在使用/調用時傳入具體的類型(類型實參)。
為什么要使用泛型?
先看如下代碼:
public class GenericTest { public static void main(String[] args) { List list = new ArrayList(); list.add("qqyumidi"); list.add("corn"); list.add(100); for (int i = 0; i < list.size(); i++) { String name = (String) list.get(i); // 1 System.out.println("name:" + name); } } }
在如上的編碼過程中,我們發現主要存在兩個問題:
1.當我們將一個對象放入集合中,集合不會記住此對象的類型,當再次從集合中取出此對象時,改對象的編譯類型變成了Object類型,但其運行時類型任然為其本身類型。
2.因此,//1處取出集合元素時需要人為的強制類型轉化到具體的目標類型,且很容易出現“java.lang.ClassCastException”異常。
使用泛型后寫法:
public class GenericTest { public static void main(String[] args) { /* List list = new ArrayList(); list.add("qqyumidi"); list.add("corn"); list.add(100); */ List<String> list = new ArrayList<String>(); list.add("qqyumidi"); list.add("corn"); //list.add(100); // 1 提示編譯錯誤 for (int i = 0; i < list.size(); i++) { String name = list.get(i); // 2 System.out.println("name:" + name); } } }
采用泛型寫法后,在//1處想加入一個Integer類型的對象時會出現編譯錯誤,通過List<String>,直接限定了list集合中只能含有String類型的元素,從而在//2處無須進行強制類型轉換,因為此時,集合能夠記住元素的類型信息,編譯器已經能夠確認它是String類型了。
反射機制是什么?
反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
反射機制能做什么?
反射機制主要提供了以下功能:
-
在運行時判斷任意一個對象所屬的類;
-
在運行時構造任意一個類的對象;
-
在運行時判斷任意一個類所具有的成員變量和方法;
-
在運行時調用任意一個對象的方法;
-
生成動態代理。
反射機制的實用案例
利用反射機制獲取類的方法名、返回值、參數,代碼如下
package fanxingText; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class FxTest { public static void main(String[] args) { List l = new ArrayList<>(); pointClassInfo(l); } public static void pointClassInfo(Object o){ Method[] methods = (o.getClass()).getMethods(); for(Method method : methods){ System.out.print(method.getReturnType().getName() +" "); System.out.print(method.getName() +" " + "("); for(Class c : method.getParameterTypes()){ System.out.print(c.getName()+ ","); } System.out.println(")"); } } }
利用反射機制將泛型為String的ArrayList中存放一個Integer類型的對象,代碼如下:
package fanxingText; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class SetArrayList { public static void main(String[] args) throws Exception { SetArrayListOtherParam(); } @SuppressWarnings({ "rawtypes", "unchecked" }) public static void SetArrayListOtherParam() throws Exception{ List<String> strings = new ArrayList<String>(); System.out.println(strings.add("111")); Class c = strings.getClass(); Method m = c.getMethod("add",Object.class); m.invoke(strings, 1000); for(Object o : strings){ System.out.println(o); } } }
