1. 程式人生 > >java泛型程式設計——定義簡單泛型類+泛型方法

java泛型程式設計——定義簡單泛型類+泛型方法

【0】README

0.1) 本文描述+原始碼均 轉自 core java volume 1, 旨在理解 java泛型程式設計 的 定義泛型類+泛型方法的知識

【1】一個泛型類: 就是具有一個或多個型別變數的類;

1.1)看個荔枝:

public class Pair<T>
{
    private T first;
    private T second;
    public Pair() { first = null; second = null; }
    public Pair(T first, T second) { this.first = first; this
.second = second; } public T getFirst() { return first; } public T getSecond() { return second; } public void setFirst(T newValue) { first = newValue; } public void setSecond(T newValue) { second = newValue; } }

對以上程式碼的分析(Analysis):

  • A1) Pair類引入了一個型別變數T,用尖括號(<>) 括起來, 並放在類名的後面;
  • A2)泛型類可以有多個型別變數, 如, 定義 Pair 類, 其中第一個和第二個域使用不同的型別: public class Pair
Pair<String>();
Pair<String>(String , String);

和方法:

String getFirst()
String getSecond()
void setFirst(String)
void setSecond(String)
  • 1.2.2)一句話說完: 泛型類可以看做普通類的工廠;

1.3)看個荔枝:

【2】 泛型方法

2.1)如何定義一個帶型別引數的泛型方法:

class ArrayAlg
{
    public
static<T> T getMiddle(T... a) { return a[a.length / 2]; } }
  • 2.1.1)當呼叫一個泛型方法時, 在方法名前的尖括號中放入具體的型別:
String middle = ArrayAlg.<String>getMiddle("john", "Q.", public ");
  • 2.1.2)其實, 方法呼叫中可以省略 型別引數, 編譯器有足夠的資訊能偶推斷出所呼叫的方法;也就是說, 可以呼叫
String middle = ArrayAlg.getMiddle("john", "Q.", public ");

2.2)在大多數情況下, 對於泛型方法的引用都沒有問題。 偶爾, 編譯器也會提示錯誤,看個荔枝:

double middle = ArrayAlg.getMiddle(3.14, 0, 1729);
  • 2.2.1)簡單地說, 編譯器將會自動打包引數為 1個 Double 和 2個Integer 物件,而後尋找這些類的共同超型別。
  • 2.2.2)事實上, 找到2個這樣的超型別:Number 和 Comparable 介面, 其本身也是一個泛型型別。 在這種情況下, 可以採取的補救措施是 將 所有的引數寫為 double 值;

Hint)

  • H1)如果想要知道 編譯器對一個泛型方法呼叫最終推斷出哪種型別, 某某人推薦一個方法:有目的地引入一個錯誤, 並研究所產生的錯誤訊息。
  • H2)例如,看一下呼叫 ArrayAlg.getMiddle(“hello”, 0, null), 這是肯定錯誤 的, 將會得到錯誤報告:
    這裡寫圖片描述
    大致的意思是:可以將結果賦值給 Object、Serialiable 或 Comparable;