在jdk5以前,集合中的元素都是object型別,從集合中取出元素的時候往往需要進行強制型別轉換,例如:
list
list
=new arraylist();
list
.add("hello");
integer i = (integer) list
.get(0);
以上**可以編譯通過,但是會報執行時異常。
試想當乙個公司把軟體產品交給客戶後,客戶在執行時發生了錯誤,然後再通知軟體公司修改錯誤,這種修改過程會花費很多周折。因此錯誤發現的越早,越能提高軟體除錯的效率,提高軟體的健壯性。
在jdk的版本公升級中,致力於把一些執行時異常轉變為編譯時錯誤,在引入泛型後,宣告集合和建立集合物件時,可以使用」<>」來執行集合中的元素型別:
list
<
string
>
list
=new arraylist<
string
>();
list
.add("hello");
string s =
list
.get(0);
加入泛型後的list只允許存放string型別的變數,如果往list中加入別的型別變數時,編譯時就會發現錯誤。
語法形式為:
public
class
limitbag
extends
number>
限制了引數型別t只能是number類或者number的子類。
public
class arraybag
public
static
void
main(string args);
arraybagbag = new arraybag(content);
}}
以上arraybag類的main()方法先建立了乙個string型別的陣列,再把陣列傳給arraybag類的構造方法,是合法的。
但是注意不能使用泛型直接建立乙個泛型陣列!
定義泛型方法要比泛型類複雜一點,如下:
public
class
methodtest
}/**
* 泛型的數量可以為任意個,如public與返回值之間的*/
public
static
k showkeyname(key)
}
在泛型機制中,編譯器認為set
和hashset
是存在繼承關係的,因此下面的賦值是合法的:
set
set = new hashset();
而編譯器認為set
和hashset
不是繼承關係,以下賦值會造成編譯錯誤:
set
set = new hashset();
這時想寫乙個既能列印hashset
和hashset
的方法是不可能的,而萬用字元?
就是為了解決這個問題的。
public
void
printset(set<?> set)
}
set<?>
表示set集合中可以存放任意型別的元素。
萬用字元?
與extends關鍵字連用,用來限制引數的上限
treeset<? extends 型別1> treeset = new treeset《型別2>();
以上表示型別2必須是型別1,或者型別1的子類。
萬用字元?
與super關鍵字連用,用來限制引數的下限
treeset<? super 型別1> treeset = new treeset《型別2>();
以上表示型別2必須是型別1,或者型別的父類。
泛型擦除:在程式執行時,泛型類是被所有這種類的例項共享的。儘管arratlist
和arraylist
在編譯時被看做不同型別的,實際上在編譯後的位元組碼中,泛型會被擦除,arratlist
和arraylist
均被看成arraylist
型別。因此所有泛型的例項都共享乙個執行時類:
list
<
string
> list1 =
new arraylist<>();
list
<
integer
> list2 =
new arraylist<>();
system.out.println(list1.getclass() == list2.getclass());//列印true
編譯器不允許在乙個類中定義兩個同名的方法,分別以arratlist
和arraylist
作為引數,以下是非法的過載:
public class overloadtest
public void test(listls)
}
不能對確切的泛型使用instanceof
操作,編譯時會出錯,使用萬用字元可以:
listlist1 = new arraylist<>();
//if(list1 instanceof list) //編譯出錯
if(list1 instanceof list<?>)//編譯成功
不能對泛型進行強制型別轉換,會存在安全隱患:
list
<
string
> list1 =
new arraylist<>();
list1.add("hello");
//編譯產生警告
arraylist<
integer
> list2 = (arraylist<
integer
>) list1;
list2.add(2);
for(integer i : list2)
JAVA中的泛型
1 泛型的基本作用 有時候建立乙個類,需要這個類中的屬性是object型別的,可以時而為string型別,時而為long型別等。比如乙個座標類point,橫座標和縱座標可能是整型,可能是浮點型,也可能是字串型別,需要輸出的結果如下 如下 package org.mole.t public class...
Java中的泛型
我們在定義的時候 就會確定資料型別 而泛型 就是是資料型別引數化 集合框架中沒有使用泛型和使用泛型的比較 沒有使用泛型 list li new linkedlist li.add 100 int x int li.get 0 system.out.println x 使用泛型 listli new ...
java中的泛型
如果乙個類裡只接受整數型別,那麼無法加入浮點型別 如果用object類物件取代整數型別,那麼編譯器就要正常判斷當前物件實際是哪一種型別,這會很浪費時間。如果用某個未指定的型別t取代整數型別,實際使用時再加入具體型別,那麼就可以處理多種型別的物件。例如 public class store publi...