,如果想要一個變數可以儲存整數型態也可以儲存字串型態,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,這行就會編譯錯誤
}}
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,這行就會編譯錯誤
}}
沒有留言:
張貼留言