引入:設計一個表示座標的類Point,該類有兩個欄位,橫座標和縱座標,要求座標有3種表達形式。
(1)整數
(2)小數
(3)字串
/* * 利用泛型表示座標點 * 定義一個類的時候,採用T來表示一種類型,僅僅表示預留位置; * 但是此時真正的類型尚未確定,使用的時候才確定 */public class Point<T> {//橫座標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 PointDemo {public static void main(String[] args) {//給定泛型型別的時候,只能給定參考型別(基礎資料型別 (Elementary Data Type)的封裝類)Point<Integer> p = new Point<>();p.setX(1);p.setX(2);Point<Double> p2 = new Point<>();p2.setX(2.0);p2.setY(3.0);Point<String> p3 = new Point<String>();p3.setX("3");p3.setY("4");}}
泛型是Java5開始出現的,以支援建立可以按類型進行參數化類別。
泛型能保證大型應用程式的型別安全和良好的維護性。
若一個類中多個欄位需要不同的泛型聲明,則在聲明類的時候指定多個泛型類即可:
public interface IDAO<PK, T> {PK add(T t);void remove(PK id);void update(PK id, T t);T get(PK id);}
使用泛型萬用字元:在進行應用傳遞的時候泛型型別必須匹配才可以傳遞,否則編譯不通過。
使用“?”,表示未知類型的泛型對象。
泛型上下限:
上限:<? extends Numer> 表示參數類型只能是該I類型或該類型的子類
下限:<? super String> 表示參數類型只能是該類型或該類型的父類
泛型方法:
/** * <T>表示聲明使用 T 表示一種類型, 範圍僅僅在該方法類 * @param t */public static <T> void show(T t) {System.out.println(t.getClass());//獲得對象的真正類型}
泛型介面:
(1)聲明泛型DAO介面,讓子類來繼承
import java.io.Serializable;import java.util.List;public interface IGenericDAO<T> {void add(T o);void remove(Serializable id);void update(Serializable id,T newObj);T get(Serializable id);List<T> getAll();}
(2)聲明子類DAO介面,並繼承泛型介面
public interface IDeptDAO extends IGenericDAO<Dept> {}
(3)聲明泛型DAO介面的實作類別
public class GenericDAOImpl<T> implements IGenericDAO<T>{@Overridepublic void add(T o) {}@Overridepublic void remove(Serializable id) {}@Overridepublic void update(Serializable id, T newObj) {}@Overridepublic T get(Serializable id) {return null;}@Overridepublic List<T> getAll() {return null;}}
(4)聲明子類介面的實作類別
public interface IDeptDAO extends IGenericDAO<Dept>{}