java的泛型基礎入門

來源:互聯網
上載者:User

標籤:不可   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的泛型基礎入門

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.