1. 程式人生 > 實用技巧 >Java--集合之泛型

Java--集合之泛型

一、泛型定義

  • Java泛型是 JDK1.5中引入的一個新特性,其本質是引數化型別,把型別作為引數傳遞
  • 常見形式有泛型類、泛型介面、泛型方法。
  • 語法:<T,...> T稱為型別佔位符,表示一種引用型別 (T也可以寫為E K V)
  • 好處:提高程式碼的重用性;防止型別轉換異常,提高程式碼的安全性

二、泛型類

  語法:類名<T>

package com.monv.generic;
/**
 * 泛型類
 * 語法:類名<T>
 * T是型別佔位符,表示一種引用型別,如果編寫多個用逗號隔開
 * @author Administrator
 *
 */
public
class MyGeneric<T> { //使用泛型T //1.建立變數 T t1; //2.泛型作為方法的引數 public void show(T t){ //這裡只能建立變數 不能例項化 因為不知道T具體的型別是什麼 不知道其構造方法是共有的還是私有的,有沒有無參構造 // T t1 = new T(); System.out.println(t); } //3.泛型作為方法的返回值 public T getT(){ return t1; } }
-------------------------------------------------------- package com.monv.generic; public class TestGeneric { public static void main(String[] args) { //使用泛型類來建立物件 //注意:1.泛型只能是引用型別 2.不同泛型型別物件之間不能相互賦值 MyGeneric<String> myGeneric = new MyGeneric<String>(); myGeneric.t1
= "hello"; myGeneric.show("java"); String s1=myGeneric.getT(); MyGeneric<Integer> myGeneric2 = new MyGeneric<Integer>(); myGeneric2.t1 = 150; myGeneric2.show(300); myGeneric2.getT(); }

三、泛型介面

  語法:介面名<T>

package com.monv.generic;
/**
 * 泛型介面
 * 語法:介面名<T>
 * 注意:不能使用泛型建立靜態常量
 * @author Administrator
 *
 */

public interface MyInterface<T> {
    String name = "張三";
    
    T Service(T t);//抽象方法

}
--------------泛型介面實現方法1-------------------------------
package com.monv.generic;

public class MyInterfaceImpl implements MyInterface<String>{
    
    @Override
    public String Service(String t) {
        // TODO Auto-generated method stub
        System.out.println(t);
        return t;
    }
}
--------------泛型介面實現方法2-------------------------------
package com.monv.generic;
/**
 * 實現類也定義成泛型類
 */
public class MyInterfaceImpl2<T> implements MyInterface<T>{
    @Override
    public T Service(T t) {
        // TODO Auto-generated method stub
        System.out.println(t);
        return t;
    }
}
-------------------測試例項--------------------------------
package com.monv.generic;

public class TestGeneric {
    public static void main(String[] args) {
        //泛型介面
        MyInterfaceImpl myInterfaceImpl = new MyInterfaceImpl();
        myInterfaceImpl.Service("大家好!!");
        
        MyInterfaceImpl2<String> myInterfaceImpl2 = new MyInterfaceImpl2<String>();
        myInterfaceImpl2.Service("java世界!");
        
        MyInterfaceImpl2<Integer> myInterfaceImpl3 = new MyInterfaceImpl2<Integer>();
        myInterfaceImpl3.Service(200);

    }
}

四、泛型方法

  語法:<T>方法返回值型別

package com.monv.generic;
/**
 * 泛型方法
 * 語法:<T>方法返回值型別
 */
public class MyGenericMethod {
    //泛型方法   T作為方法的返回型別
    public <T> T show(T t){
        System.out.println("泛型方法 "+t);
        return t;
    }
}--------------測試例項--------------------------------
package com.monv.generic;

public class TestGeneric {
    public static void main(String[] args) {
        //泛型方法  型別不需要傳遞,型別由傳遞的值的型別來決定
        MyGenericMethod myGenericMethod = new MyGenericMethod();
        myGenericMethod.show("Hello World");
        myGenericMethod.show(205);
        myGenericMethod.show(3.415);
    }
}

五、泛型集合

概念:引數化型別、型別安全的集合,強制集合元素的型別必須一致。

特點:編譯時即可檢查,而非執行時丟擲異常

訪問時不必型別轉換(拆箱)。

不同泛型之間引用不能相互賦值,泛型不存在多型

package com.monv.generic;

public class Student {
    String name;
    Integer age;
    
    public Student() {
        // TODO Auto-generated constructor stub
    }       
    
    public Student(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    
}
-----------------------------------------------------------
package com.monv.generic;

import java.util.ArrayList;
import java.util.Iterator;public class Demo {
    public static void main(String[] args) {
        //ArrayList 也是泛型類 在用的時候沒有傳遞型別 預設的是Object類 可以Add任何型別的資料
        ArrayList arrayList = new ArrayList();
        arrayList.add("XXX");
        arrayList.add("YYY");
        arrayList.add(10);
        arrayList.add(30);
        //arrayList2 在建立的時候傳遞了型別為 String 所以在Add的時候只能新增String型的資料
        ArrayList<String> arrayList2 = new ArrayList<String>();
        arrayList2.add("XXX");
        arrayList2.add("YYY");
//        arrayList2.add(10);
        for (String string : arrayList2) {
            System.out.println(string);
        }
        
        ArrayList<Student> arrayList3 = new ArrayList<Student>();
        Student s1 = new Student("小樂", 18);
        Student s2 = new Student("小明", 19);
        Student s3 = new Student("小花", 19);
        arrayList3.add(s1);
        arrayList3.add(s2);
        arrayList3.add(s3);
//        arrayList3.add("111");//只能新增Student型別的 新增String型別的就會報錯
        
        Iterator<Student> it = arrayList3.iterator();
        while(it.hasNext()){
            Student str = it.next();
            System.out.println(str.toString());
        }
        
    }
}