顯示具有 Generics 標籤的文章。 顯示所有文章
顯示具有 Generics 標籤的文章。 顯示所有文章

2014年4月17日 星期四

Generics : 多個泛型類型

class GenericNumbers <T1,T2>{
 private T1 number1;
 private T2 number2;
 
 public void setNumber1(T1 number){
  this.number1 = number;
 }
 
 public T1 getNumber1(){
  return number1;
 }
 
 public void setNumber2(T2 number){
  this.number2 = number;
 }
 
 public T2 getNumber2(){
  return number2;
 }
}
public class GenericsMultiDefined {

 public static void main(String[] args) {
  GenericNumbers <Integer, Double> number = new GenericNumbers<Integer, Double> ();
  number.setNumber1(10);
  number.setNumber2(20.5);
  Double d = number.getNumber1() + number.getNumber2();
  System.out.println("total : "+d);
 }

}
執行結果

Generics : 單個泛型類型

定義類別 class 時,當幾個類別的邏輯其實都相同,但只有涉及的資料型態不同時,則以泛型來定義類別(Generics Class)。

泛型類別本身就是資料形態,可用來宣告物件。

使用時要注意轉換型態或介面 type casting,否則在執行時 run time 會發生 ClassCastException。

class GenericNumber <T>{
 private T number;
 
 public void setNumber(T number){
  this.number = number;
 }
 
 public T getNumber(){
  return number;
 }
}

public class GenericsUndefined {

 public static void main(String[] args) {
  GenericNumber <Integer> i = new GenericNumber <Integer>();
  i.setNumber(10);
  System.out.println("Integer value : " + i.getNumber());
  
  GenericNumber <Boolean> f = new GenericNumber <Boolean> ();
  f.setNumber(true);
  System.out.println("Boolean value : " + f.getNumber());
  
  GenericNumber <Double> d = new GenericNumber <Double> ();
  d.setNumber(10.5);
  System.out.println("Double value : " + d.getNumber());
  
 }
}
執行結果




以泛型類別方法寫程式時,若不同型別做指定, 例如 d = i ; 時,編譯會出現如下錯誤
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
 Type mismatch: cannot convert from GenericNumber to GenericNumber

 at GenericsUndefined.main(GenericsUndefined.java:28)