JAVA泛型

我先對java泛型的注意點還有作用,優勢做一個簡單的闡述

   1. java 泛型參數只能是類類型(如Integer,String,還有一些類類型  ),不能是簡單類型.

   2.泛型可以說明任何實例方法中的局部變量,類的成員變量,方法的形式參數,以及方法的返回值.

   3.泛型 保證的對象間類型轉換的安全,也簡化了過程,不必在Object類和實際操作的數據類型之間進行強制類型轉換.

   4.泛型可以將所有的對象強制類型轉換成自動轉型和隱式類型,泛型擴展了重複使用代碼的能力,而且既安全又簡單.

  

   範例一:在沒有泛型時,大家都會遇到如下問題.

             class  Apple

             {

                      private static long counter;

                      private final long id = counter++;

                      public long id()

                      {

                              return id;

                      }

             }

            class Orange{}

            class  Test

            {

                     public static void main(String[]args)

                     {

                              ArrayList  arrayList = new ArrayList();

                              //可以想ArrayList中添加任何對像,在編譯期和運行期沒有任何錯誤

                              for(int i=0;i<3;i++)

                              {

                                     arrayList.add(new Apple());

                              }

                              arrayList.add(new Orange());

                              for(int i=0; <arrayList.size();i++)

                              {

                                   Object obj = arrayList.get(i);

                                    //必須進行強制類型轉換

                                   Apple apple = ((Apple)arrayList.get(i)).id();

                                   //當將Orange對象轉換爲Apple時報錯

                              }

                            

                     }

            }

  範例分析:  Apple類和Orange 類除了繼承自Object  ,兩個類是完全不同的類(如果一個類沒有明確繼承自那個類,那麼他自動繼承自Object類)

                     因爲ArrayList 保存的是Object類,因此你不僅可以通過ArrayList 中的Add()方法添加Apple對象  還可以添加Orange對象.無論是在

                     編譯期還是運行期都不會有問題. 當你用ArrayList的get()方法取出你認爲是Apple 對象的方法時,你得到的只是Object 的引用,必須

                     將其強制轉型爲Apple,否責會有語法錯誤.當將Orange  轉型爲Apple時,就會右語法錯誤.

  範例二:用泛型來解決範例一中,不安全,類型轉換,問題,代碼如下

              class Test2

              {

                    public static void main(String[]args)

                    {

                              ArrayList<Apple>  arrayList = new ArrayList<Apple>();

                              for(int i=0; i<3;i++)

                              arrayList.add(new Apple());

                              //不能向ArrayList  中添加Orange對象,泛型已經確定是Apple對象

                              arrayList.add(new Orange());

                            

                             //從ArrayList中取出對象,並調用對象的方法

                             for(int i= 0;i<arrayList.size();i++)

                             {

                                    //將不需要進行強制類型轉換

                                    System.out.println(arrayList.get(i).id());

                             }



                             for(Apple c: arrayList)

                             {

                                     System.out.println(c.id());

                             }

                    }

              }

      範例三:當你指定某個類型作爲泛型參數時,你並不僅限於只能將該確切類型的對象放置到容器中,向上轉型也可以像作用與其他類型一樣作用於泛型

                  class  a1 extends Apple{}

                  class  a2 extends Apple{}

                  class  a3 extends Apple{}

                  class Test

                  {

                          public static void main(String[]args)

                          {

                                ArrayList<Apple>  arrayList = new ArrayList<Apple>();

                                arrayList.add(new a1());

                                arrayList.add(new a2());

                                arrayList.add(new a3());

                               

                                for(Apple c : arrayList)

                                {

                                     System.out.println(c);

                                }

                          }

                  }    

            範例三:自定義泛型類

            public  class MyFirstGeneric<T>

            {

                  T t;

                  MyFirstGeneric(T t1)

                 {

                       t = t1;

                 }

                 T getT()

                 {

                            return t;

                 }

                 void  printType()

                 {

                        System.out.println(t.getclass.getName());

                 }

                 public static void main(String[]args)

                 {

                         MyFirstGeneric<String>    str = new  MyFirstGeneric<String>("sdd");

                         str.printType();

                         String string = str.getT();

                         MyFirstGeneric<Date>    date = new  MyFirstGeneric<Date>(new Date());

                         date.printType();

                         Date d = date.getT();


                  }

            }


發佈了28 篇原創文章 · 獲贊 16 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章