Java泛型基礎

java那些事2018-12-15 12:45:07

作者丨Seandy
https://www.jianshu.com/p/c8ac39183522


Java泛型基礎


1. 認識泛型


  • 泛型是在JDK1.5之後增加的新功能.

  • 泛型可以解決數據的安全性問題, 主要的原理是在類聲明的時候通過一個標識表示類中某個屬性的類型或者是某個方法的返回值及參數類型.

  • 格式:



訪問權限 class 類名稱<泛型, ...="">{
    屬性
    方法
}


  • 對象的創建:

    類名稱<具體類型> 對象名稱 = new 類名稱<具體類型>();

  • 示例


/**
 * 經緯度
 * 
 * @author dixin
 *
 */

class Point {
    private T x;
    private T y;

    public T getX() {
        return x;
    }

    public void setX(T x) {
        this.x = x;
    }

    public T getY() {
        return y;
    }

    public void setY(T y) {
        this.y = y;
    }
}

public class GenericDemo01 {

    public static void main(String[] args) {

        Point p1 = new Point();
        p1.setX("經度為10");
        p1.setY("緯度為100");

        Point p2 = new Point();
        p2.setX(10);
        p2.setY(100);

        System.out.println(p1.getX() + ", " + p1.getY());
        System.out.println(p2.getX() + ", " + p2.getY());
    }
}

// 執行結果
經度為10, 緯度為100
10100


2. 構造方法中使用泛型


class Con {

    private T value;
    // 類定義中已經定義泛型T, 方法中可以直接使用, 不用加<>
    public Con(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}

public class GenericDemo02 {

    public static void main(String[] args) {
        Con c = new Con("構造方法中使用泛型");
        System.out.println(c.getValue());
    }
}


3. 設置多個泛型


兩個泛型的例子:


class Gen {

    private K key;
    private T value;

    public K getKey() {
        return key;
    }

    public void setKey(K key) {
        this.key = key;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }

}

public class GenericDemo03 {

    public static void main(String[] args) {
        Gen gen = new Gen();
        gen.setKey("key");
        gen.setValue(10);

        System.out.println(gen.getKey() + ", " + gen.getValue());
    }
}


4. 通配符


類型不統一問題


class Info {

    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    @Override
    public String toString() 
{
        return this.getValue().toString();
    }
}

public class GenericDemo04 {

    public static void main(String[] args) {
        Info i = new Info();
        i.setValue("類型不統一");
        tell(i); // 編譯報錯
        // The method tell(Info) in the type GenericDemo04 is not applicable for the arguments 
 (Info)
    }

    public static void tell(Info i) {
        System.out.println(i);
    }
}


原因:

泛型是不可變的, 對於任意兩個不同的類型Type1和Type2, List既不是List的子類型, 也不是List的父類型. 所以這裡不能將轉換成.


解決方式:

  • public static void tell(Infoi)中去掉, 使用raw類型, 但這樣就失去了泛型的安全性檢查意義.



  • 更好的方式, 採用通配符.

    修改為public static void tell(Info i)

  • 5. 泛型接口


    • 聲明泛型接口和聲明泛型類的語法類似, 也是在接口名稱後面加上.

    • 格式:

      interface 接口名稱<泛型標識>

    示例:


    interface IGen<T{
        public void say();
    }

    class GenImpl<Timplements IGen<T{

        private String info;

        public GenImpl(String info) {
            this.info = info;
        }

        public void setInfo(String info) {
            this.info = info;
        }

        public String getInfo() {
            return info;
        }

        @Override
        public void say() {
            System.out.println(this.info);
        }
    }

    public class GenericDemo05 {

        public static void main(String[] args) {
            IGen g = new GenImpl("泛型接口");
            g.say();
        }
    }


    6. 泛型方法


    • 泛型方法中可以定義泛型參數, 此時, 參數的類型就是傳入數據類型.

    • 格式:

      訪問權限 <泛型標識> 泛型標識 方法名稱([泛型標識 參數名稱])

    • 示例:


    public class GenericDemo06 {

        public static void main(String[] args{
            String str = tell("Hello");
            System.out.println(str);
            int i = tell(10);
            System.out.println(i);
        }

        // 是第一泛型參數, 寫在訪問權限和static後面
        public static  tell(T t{
            return t;
        }
    }

    // 執行結果
    Hello
    10


    7. 泛型數組


    泛型數組的使用要和泛型方法搭配使用.


    • 在使用泛型方法的時候, 也可以傳遞或返回一個泛型數組.


    public class GenericDemo07 {

        public static void main(String[] args{

            String arrStr[] = { "A""B""C" };
            tell(arrStr);

            Integer arrInt[] = { 123 };
            tell(arrInt);
        }

        public static  void tell(T arr[]{
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }
        }
    }


推薦程序員必備微信號 


程序員內參
微信號:

programmer0001



推薦理由:
在這裡,我們分享程序員相關技術,職場生活,行業熱點資訊。不定期還會分享IT趣文和趣圖。這裡屬於我們程序員自己的生活,工作和娛樂空間。


 ▼長按下方↓↓↓二維碼識別關注
https://weiwenku.net/d/109759130