標籤:不可 vat try demo1 dem 子類 obj tostring ram
1.泛型的作用
防止隨意的放置任何的對象,使用泛型後只能按我們使用時指定的類型添加以及會相應的進行編譯時間檢查,在編譯檢查後會去除相應的泛型資訊(運行時沒有這個資訊了),在類型轉換的也會自動的相應的轉換為相應的資訊
public class GenenricyDemo1 { public static <T> T test1(T t){ return t; } public <T> T test2(T t){ return t; } public static void main(String[] args) { String test1 = GenenricyDemo1.test1("a"); String test2 = new GenenricyDemo1().test2("b"); } }
2.泛型的編譯時間類型檢查(泛型是沒有多態。直接比較放入類的class檔案,但是在數組中是可以有多態的)
public class GenericyDemo2 { public static void main(String[] args) { // ArrayList<Object> arrayList = new ArrayList<String>();//編譯時間錯誤 ArrayList<String> arrayList = new ArrayList<>();//編譯時間正常 ArrayList arrayList1 = new ArrayList<String>();//編譯時間正常 ArrayList<Object> arrayList2=arrayList1 ;//編譯時間正常,編譯時間一行一行檢查的 // arrayList2=arrayList;//編譯時間錯誤
//Vector<String > [] vct=new Vector<String >[10]; //編譯錯誤,參數化型別沒有數組的表達形式
//ArrayList<int> str=null;//編譯錯誤,泛型參數只能對對象不能是基本類型的資料,不會自動封裝
Object [] objs= new String [10];//編譯時間通過
interface GenericyDemo9Iface<GenericyDemo>{//? extends GenericyDemo9Fater是不能使用的(類 介面等)
}}
3.繼承實現泛型
@SuppressWarnings("all")public class GenericyDemo3<B, A, C> extends GenericyDemo3Father<A> implements GenericyDemo3Iface<B> { private static final String ParameterizedType = null; private C c; @Override public String test(B t) { return t.toString(); } private <T> T test3(T t) { return t; } public static void main(String[] args) { Type[] genericInterfaces = GenericyDemo3.class.getGenericInterfaces(); System.out.println(genericInterfaces[0]); Type superclass = GenericyDemo3.class.getGenericSuperclass(); if (superclass instanceof ParameterizedType) { Type[] actualTypeArguments = ((ParameterizedType) superclass).getActualTypeArguments(); System.out.println(actualTypeArguments[0]); } GenericyDemo3 genericyDemo3 = new GenericyDemo3(); try { Method[] methods = genericyDemo3.getClass().getDeclaredMethods(); for (Method method : methods) { if (method.getName().equals("test3")) { method.setAccessible(true); Object invoke = method.invoke(genericyDemo3, "String"); if (invoke.getClass() == String.class) { System.out.println(invoke);// 有輸出String // 因為我們擷取的位元組碼檔案還是自己本身 } } } } catch (Exception e) { e.printStackTrace(); } }}interface GenericyDemo3Iface<T> { public String test(T t);}class GenericyDemo3Father<T> { public String test1(T t) { return t.toString(); }}
4.泛型不寫與書寫Obejct的區別
public class GenericyDemo4 { //不寫泛型預設為Object,編譯時間不會進行類型檢查 //寫泛型為Object,編譯時間不會進行類型檢查 public static void main(String[] args) { ArrayList arrayList = new ArrayList(); arrayList.add("a"); arrayList.add(1); ArrayList<Object> arrayList1= new ArrayList<>(); arrayList1.add("a"); arrayList1.add(1); }}
5.擷取泛型的類型
public class GenericyDemo5 { public static void main(String[] args) throws Exception { Method[] methods = GenericyDemo5Test.class.getMethods(); for (Method method : methods) { if (method.getName().equals("test")) { Type[] parameterTypes = method.getGenericParameterTypes(); System.out.println(parameterTypes[0]); } } }}class GenericyDemo5Test { public Vector<String> test(Vector<String> Str) { return null; }}
6.泛型的拭除
public class GenericyDemo6 { public static void main(String[] args) { ArrayList<String> arrayList = new ArrayList<>(); ArrayList<Integer> arrayList1 = new ArrayList<>(); System.out.println(arrayList.getClass()==arrayList1.getClass());//true}}
7.萬用字元的特徵:
1)可以用於宣告類型和聲明方法的參數上,執行個體化時需指定,不可以用於聲明類的參數上;
2)?只能輸入和輸出,不能修改;
3)? extends 上限 (繼承或者實現關係);
4)? super 下限 (繼承或者實現關係,可以是下限或者是下限的子類);
public class GenericyDemo7 { public static void main(String[] args) { ArrayList<? super List<String>> arrayList1 = new ArrayList<>(); arrayList1.add(new ArrayList<>());//不能添加new Object(); 原因前面已經說明 }}
public class GenericyDemo7 { public static void main(String[] args) { ArrayList<? extends GenericyDemo7Iface> list1 = new ArrayList<>(); ArrayList<GenericyDemo7Son> list2 = new ArrayList<>(); list2.add(new GenericyDemo7Son()); list1=list2; System.out.println(list1.get(0)); //list1.add(new GenericyDemo7Son());//編譯錯誤,只能添加null值 }}class GenericyDemo7Son implements GenericyDemo7Iface {}interface GenericyDemo7Iface {}
java的泛型基礎入門