說一下泛型原理,並舉例說明

westwolf發表於2021-09-09

1.泛型的基礎概念

泛型實現了引數化型別的概念,使程式碼可以應用於多種型別。

  • 簡單泛型
public class Hold<T> {
private T a;
public Hold(T a){
    this.a = a;
}

public T getA() {
    return a;
}

public void setA(T a) {
    this.a = a;
}
}
  • 泛型介面
public interface Generator<T> {
T test();
}
  • 泛型方法
public class Hold{
     public <T> void f(T a){
     System.out.println(a.getClass().getName());
 }
}

2.泛型的擦除

考點:在泛型程式碼內部,無法獲得任何有關泛型引數型別的資訊。

  • 考題1
  class c1 = new ArrayList<String>().getClass();
  class c2 = new ArrayList<Integer>().getClass();
  System.out.println(c1 == c2);
  答案:true
  • 考題2
class Frob {}
class Fnorkle {}
class Quark<Q> {}
class Particle<POSITION,MOMENTUM> {}

public class LostInformation {
public static void main(String[] args) {
  List<Frob> list = new ArrayList<Frob>();
  Map<Frob,Fnorkle> map = new HashMap<Frob,Fnorkle>();
  Quark<Fnorkle> quark = new Quark<Fnorkle>();
  Particle<Long,Double> p = new Particle<Long,Double>();
  System.out.println(Arrays.toString(
    list.getClass().getTypeParameters()));
  System.out.println(Arrays.toString(
    map.getClass().getTypeParameters()));
  System.out.println(Arrays.toString(
    quark.getClass().getTypeParameters()));
  System.out.println(Arrays.toString(
    p.getClass().getTypeParameters()));
}
} 

/* Output:
[E]
[K, V]
[Q]
[POSITION, MOMENTUM]
*///:~

3.泛型的邊界

將某個引數限制為某個型別的子集。為了執行這種限制,Java 泛型重用了extends 關鍵字。

interface HasColor { java.awt.Color getColor(); }

class Colored<T extends HasColor> {
 T item;
 Colored(T item) { this.item = item; }
 T getItem() { return item; }
 // The bound allows you to call a method:
 java.awt.Color color() { return item.getColor(); }
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4662/viewspace-2824051/,如需轉載,請註明出處,否則將追究法律責任。

相關文章