熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java 學習筆記:泛型(一)

2022-06-13   來源: Java高級技術 

  一 為什麼需要泛型
        在面向對象編程語言中多態算是一種泛型但是多態一般的做法是把子類賦給其基類以此實現靈活性更高的代碼 但是受限於Java的單繼承機制代碼的靈活性並不能得到多大的提高於是設計模式中推薦的法則是面向接口編程可是問題還是沒有得到很好的解決因為即使是面向接口編程對於設計類庫這種需求在某種程度上來說還是太過苛刻了(試想一下如果你需要寫一個容器類但是容器裡面的元素要求實現某個特定的接口這樣是不是會變得有點麻煩)泛型是Java SE的一個新特性憑借泛型java實現了參數化類型的概念
        對比一下以下代碼:

       public class GenericTest {
        private Object a;

  public GenericTest(Object a)
        {
            thisa = a;
        }

  public Object getA() {
            return a;
        }

  public void setA(Object a) {
            thisa = a;
        }

  public static void main(String[] args)
        {
            GenericTest g = new GenericTest();
            String str = (String)ggetA();          ①
            gsetA();              ②
            Integer x = (Integer) ggetA();
        }
    }

    

  public class GenericTest <T> {
        private T a;

  public GenericTest(T a)
        {
            thisa = a;
        }

  public T getA() {
            return a;
        }

  public void setA(T a) {
            thisa = a;
        }

  public static void main(String[] args)
        {
            GenericTest<String> g = new GenericTest<String>();
            String str = ggetA();                  ①
            // 編譯時錯誤
            gsetA()                                           ②
        }
    }


        從兩段程序的①可以看出使用泛型之後我們不再需要做類型的轉換因為編譯器會幫你處理一切細節從程序的②可以看出當我們使用泛型之後編譯器會自動進行類型檢查
       所以使用泛型之後我們可以得到更方便更安全的代碼

  二泛型接口
        泛型也可以應用於接口簡單的例子如下

     public interface GenericInterface <T> {
        T next();
    }

  public class GenericTest implements GenericInterface<Integer> {
        private int[] a;
        private int size;
        private int pos = ;
        private int addPos = ;

  public GenericTest(int sz)
        {
            thissize = sz;
            a = new int[sz];
        }

  public Integer next()
        {
            if ( pos > addPos )
            {
                pos = ;
            }

  return a[pos++];
        }

  public boolean hasNext()
        {
            return !(pos == addPos);
        }

  public boolean add(int value)
        {
            if ( addPos >= size )
            {
                return false;
            }
            else
            {
                a[addPos++] = value;
                return true;
            }
        }

  public int getSize() {
            return size;
        }
    }

  public class GenericTest implements GenericInterface<String> {
        private String[] a;
        private int size;
        private int pos = ;
        private int addPos = ;

  public GenericTest(int sz)
        {
            thissize = sz;
            a = new String[sz];
        }

  public String next()
        {
            if ( pos > addPos )
            {
                pos = ;
            }

  return a[pos++];
        }

  public boolean hasNext()
        {
            return !(pos == addPos);
        }

  public boolean add(String value)
        {
            if ( addPos >= size )
            {
                return false;
            }
            else
            {
                a[addPos++] = value;
                return true;
            }
        }

  public int getSize() {
            return size;
        }
    }

  public class GenericTest {
        public static void main(String[] args)
        {
            GenericTest g = new GenericTest();
            GenericTest g = new GenericTest();
            String[] values = abcdefghijklsplit();

  for (int i = ; i < ggetSize(); i++)
            {
                gadd(i);
            }

  for (int i = ; i < ggetSize(); i++)
            {
                gadd(values[i]);
            }

  while(ghasNext())
            {
                Systemoutprintln(gnext());
            }

  while(ghasNext())
            {
                Systemoutprintln(gnext());
            }
        }
    }


           這裡需要注意一點基本類型不能作為泛型的類型參數GenericTest裡面的元素為int但是參數需要用Integer


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27307.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.