總網頁瀏覽量

2013年3月13日 星期三

泛型Generics

類別裡面的變數若宣告為String那麼只能儲存字串型態的值,不能儲存數字、boolean值。
,如果想要一個變數可以儲存整數型態也可以儲存字串型態,java有一種功能可以讓我們自訂變數的型態。這就是泛型(Generics)基本功能。
(本質上並非讓使用者自訂變數型態,而是將變數包裝成Object的型態)

class Book<T>{//宣告類別並且裡面的變數跟method可以宣告為T型態,這邊T可以隨意亂打
private T price;//宣告T型態的變數,表示使用泛型(不限定資料類型)
public void setPrice(T price){
this.price=price;
}
public T getPrice(){
return price;
}}

public class Generics {

public static void main(String[]arg ){
Book<Integer> book1= new Book<Integer>();//<>裡面寫Integer表示,要將T指定為Integer,也就是說Book類別內容只要有T的地方都要換成Integer。
book1.setPrice(100);//所以這裡只能傳入整數,傳入其他型態的變數會編譯失敗
System.out.println(book1.getPrice());

Book book3 = new Book();//如果不指定T的類型,那就表示price什麼類型都可以接受
book3.setPrice(true);//傳入boolean值,自動轉型為Object型態
System.out.println(book3.getPrice());

book3.setPrice(11.8);//傳入double值,自動轉型為Object型態
System.out.println(book3.getPrice());
}}


執行結果:
100
true
11.8





class Book採用泛型宣告,相當於寫完所有基本型態變數的宣告,如同寫完下面的宣告:

class Book{
private Integer price;
public void setPrice(Integer price){
this.price=price;
}
public Integer getPrice(){
return price;
}}


class Book{
private String price;
public void setPrice(String price){
this.price=price;
}
public String getPrice(){
return price;
}}

二、泛型的進階設定-----限制變數型態的範圍。
比方說Book<? extends Number>

表示Book如果使用泛型,他的資料類型必須是Number類別或Number子類別。
Number子類別有Integer,Byte,Short,Long,Float,Double。

class Book<T>{
T price;
public void show(){
System.out.println(this.price);
}
public static void show(Book<? extends Number> b){//接收資料類型為Number類別或Number子類別的Book物件。
System.out.println(b.price);
}}
public class Generics {
public static void main(String[]arg ){
Book<Integer> book = new Book<>();
book.price=100;
Book.show(book);

Book<String> book2 = new Book();
book2.price="byebyeworld";
Book.show(book2);//這行會有錯,因為bookk2的泛型採用資料類型是String,不是Nubmer類別的子類別。所以不能傳遞參數。
book2.show();
}
}
三、泛型跟Collection搭配就可以限制元素的資料類型


import java.util.*;
public class CollectionGenerics {
static void showSum(Collection<? extends Integer> c){//宣告Collection,並限定只接收儲存Integer資料類型的物件。
int sum = 0;
for(Integer i: c)//因為c裡面都是Integer,所以取出的類型都是int
sum+=i;//UnautoBoxing後與sum相加
System.out.println(sum);
}
public static void main(String[] args) {
// Collection<Long> c = new ArrayList<Long>();
Collection<Integer> c = new ArrayList<Integer>();//宣告collection c為存放Integer資料類型的ArrayList。c只能存放Integer的資料類型的物件。
c.add(1);
c.add(2);
c.add(3);
   // c.add("ddd");因為我們宣告c為Integer資料類型的arraylist,這行會加入字串會編譯錯誤,因為c只能放Interger的物件
showSum(c);//如果c宣告為Long的ArrayList,這行就會編譯錯誤
}}




沒有留言:

張貼留言