鍍金池/ 教程/ Java/ Java泛型方法和構(gòu)造函數(shù)
Java參數(shù)傳遞
Java靜態(tài)內(nèi)部類
Java final關(guān)鍵字
http://www.yiibai.com/java_object_oriented_design/java_inheritan
Java泛型類
Java標準注解
Java接口教程
Java注解
Java枚舉類型
http://www.yiibai.com/java_object_oriented_design/java_class_ins
Java接口實現(xiàn)
Java哈希編碼
Java泛型約束
http://www.yiibai.com/java_object_oriented_design/java_import.ht
Java注解默認值
Java異常拋出
Java不可變對象
Java類基礎(chǔ)
Java接口繼承
Java類方法
Java訪問級別
Java對象克隆
Java初始化塊
Java可變長度參數(shù)
Java接口字段
Java對象相等比較(Equals)
Java實例和靜態(tài)方法
Java繼承方法隱藏(覆蓋)
Java面向?qū)ο笤O(shè)計
Java對象finalize()方法
Java抽象類和方法
Java Object類
Java泛型方法和構(gòu)造函數(shù)
Java枚舉體
Java接口方法
Java this關(guān)鍵字
Java注解類型的限制
Java main()方法
Java Enum類
Java注解用法
Java枚舉比較
Java注解類型
Java內(nèi)部類成員
Java繼承和構(gòu)造函數(shù)
Java類實例化
Java內(nèi)部類類型
Java對象toString()方法
Java finally塊
Java繼承教程
Java自定義異常
Java枚舉值
Java接口作為類型
Java異常類
Java方法覆蓋教程
http://www.yiibai.com/java_object_oriented_design/java_class_bas
Java枚舉方法
Java方法重載
http://www.yiibai.com/java_object_oriented_design/java_interface
Java異常用法
Java內(nèi)部類
Java類成員訪問級別
Java異常處理教程
Java注解反射
Java構(gòu)造函數(shù)(構(gòu)造器)
Java導(dǎo)入(import語句的用法)

Java泛型方法和構(gòu)造函數(shù)

泛型方法

可以在方法聲明中定義類型參數(shù),它們在方法的返回類型之前的尖括號中指定。包含泛型方法聲明的類型不必是通用類型??梢栽诜庆o態(tài)方法聲明中使用為泛型類型指定的類型參數(shù)。

示例

以下代碼顯示如何為方法m1()定義新的類型參數(shù)V。新類型參數(shù)V強制將方法m1()的第一個和第二個參數(shù)必須為相同類型。

第三個參數(shù)必須與類型T相同,這是類實例化的類型。

class MyBag<T> {
  private T ref;

  public MyBag(T ref) {
    this.ref = ref;
  }

  public T get() {
    return ref;
  }

  public void set(T a) {
    this.ref = a;
  }
}
class Test<T>  {
  public <V>  void  m1(MyBag<V>  a, MyBag<V>  b, T  c)  {

  }
}

使用通用方法

要傳遞方法的形式類型參數(shù)的實際類型參數(shù),必須在方法調(diào)用中的點和方法名之間的尖括號<>中指定它。

class MyBag<T> {
  private T ref;

  public MyBag(T ref) {
    this.ref = ref;
  }

  public T get() {
    return ref;
  }

  public void set(T a) {
    this.ref = a;
  }
}
class Test<T> {
  public <V> void m1(MyBag<V> a, MyBag<V> b, T c) {
  }
}
public class Main {

  public static void main(String[] argv) {
    Test<String> t = new Test<String>();
    MyBag<Integer> iw1 = new MyBag<Integer>(new Integer(201));
    MyBag<Integer> iw2 = new MyBag<Integer>(new Integer(202));

    // Specify that Integer is the actual type for the type parameter for m1()
    t.<Integer>m1(iw1, iw2, "hello");

    t.m1(iw1, iw2, "hello");
  }
}

實例-2

以下代碼顯示了如何聲明通用靜態(tài)方法。不能在靜態(tài)方法中引用包含類的類型參數(shù)。
靜態(tài)方法只能引用它自己聲明的類型參數(shù)。以下靜態(tài)通用類型定義了類型參數(shù)T,用于約束參數(shù)sourcedest的類型。

class MyBag<T> {
  private T ref;

  public MyBag(T ref) {
    this.ref = ref;
  }

  public T get() {
    return ref;
  }

  public void set(T a) {
    this.ref = a;
  }
}

public class Main {
  public static <T> void copy(MyBag<T> source, MyBag<? super T> dest) {
    T value = source.get();
    dest.set(value);
  }

  public static void main(String[] argv) {
  }
}

要為靜態(tài)方法調(diào)用指定實際的類型參數(shù),可以這樣做:

Main.<Integer>copy(iw1, iw2);

通用構(gòu)造函數(shù)

可以為構(gòu)造函數(shù)定義類型參數(shù)。下面的代碼定義了類Test的構(gòu)造函數(shù)的類型參數(shù)U。它放置一個約束,構(gòu)造函數(shù)的類型參數(shù)U必須是相同的,或者它的類類型參數(shù)T類型的子類型。

public class Test<T> {
  public <U extends T> Test(U k) {
  }
}

要為構(gòu)造函數(shù)指定實際的類型參數(shù)值,請在 new 運算符和構(gòu)造函數(shù)名稱之間的尖括號中指定它,如以下代碼段所示:

class Test<T> {
  public <U extends T> Test(U k) {
  }
}

public class Main {
  public static void main(String[] argv) {
    // Specify the actual type parameter for the constructor as Double
    Test<Number> t1 = new<Double> Test<Number>(new Double(1.9));

    // Let the compiler figure out, Integer is
    // the actual type parameter for the constructor
    Test<Number> t2 = new Test<Number>(new Integer(1));

  }
}

通用對象在創(chuàng)建中的類型推斷

Java7在通用類型的對象創(chuàng)建表達式中增加了對類型推斷的一些有限支持。
對于以下語句:

List<String> list = new ArrayList<String>();

Java7中,可以在上面的語句中指定空尖括號,稱為菱形操作符或簡單的菱形<>作為ArrayList的類型參數(shù)。

List<String> list = new ArrayList<>();

如果不在對象創(chuàng)建表達式中為通用類型指定類型參數(shù),那么類型是原始類型,編譯器生成未檢查的警告。
例如,以下語句將編譯產(chǎn)生未選中的警告:

List<String> list = new ArrayList(); // Generates an  unchecked  warning

不能創(chuàng)建通用的異常類。 并且沒有通用的匿名類。