java中的泛型

2021-08-17 12:22:08 字數 3284 閱讀 5808

在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)

}

在泛型機制中,編譯器認為sethashset是存在繼承關係的,因此下面的賦值是合法的:

set

set = new hashset();

而編譯器認為sethashset不是繼承關係,以下賦值會造成編譯錯誤:

set

set = new hashset();

這時想寫乙個既能列印hashsethashset的方法是不可能的,而萬用字元就是為了解決這個問題的。

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,或者型別的父類。

泛型擦除:在程式執行時,泛型類是被所有這種類的例項共享的。儘管arratlistarraylist在編譯時被看做不同型別的,實際上在編譯後的位元組碼中,泛型會被擦除,arratlistarraylist均被看成arraylist型別。因此所有泛型的例項都共享乙個執行時類:

list

<

string

> list1 =

new arraylist<>();

list

<

integer

> list2 =

new arraylist<>();

system.out.println(list1.getclass() == list2.getclass());//列印true

編譯器不允許在乙個類中定義兩個同名的方法,分別以arratlistarraylist作為引數,以下是非法的過載:

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...