Java泛型學習總結

2021-08-19 07:35:37 字數 2204 閱讀 3129

一、泛型設計的初衷

泛型程式的設計方便讓相同的**邏輯被許多不同型別的物件所重用。

二、定義泛型介面、類

public

class pair

public

void

setk(k k)

public v getv()

public

void

setv(v v)

}}

二、定義泛型方法

public

t getvalue(t t)

三、型別變數限定

類或者方法的型別變數有時候需要加以約束。例如:

public

class

pair

extends

comparable

&serializable>

限定型別變數t要繼承comparable類以及實現serializable介面。

四、使用泛型的約束和侷限性

1. 不能使用基本型別作為限定型別

pair

//wrong

pair

<

integer

>

//right

2.泛型類只存在於編譯期,執行期只存在原始型別,在編譯成位元組碼時,泛型是被擦除了的,所以在執行期進行型別查詢只適用於原始型別。

a instanceof pair//wrong
3.不能建立泛型陣列

pair

<

string, integer

>

pair

=new

pair

<

string, integer

>[1

];//wrong

4.不能例項化型別變數

new t();//wrong 

t.class;//wrong

new t;//wrong

可以採用這種方式:

public

static

t getinstance(classclazz) throws instantiationexception, illegalacces***ception

5.禁止使用帶有型別變數的靜態域和方法

public

class pair

}}

6.不能丟擲和捕獲泛型類的例項,泛型類不能擴充套件throwable介面,在異常規範中使用型別變數是可以的

public

class

problem

extends

exception{}//error

public

void dowork(class

t)catch(t e)//error

}public

void dowork(t t) throw tcatch(throwable e)//right

}

四、泛型型別的繼承規則

假設a 類繼承於b類,但是pairpair不存在任何繼承關係。

五、萬用字元型別

1.pair<? extends a>萬用字元子型別限定

? extends a geta();

void seta(? extends a

a);不能呼叫 seta, 編譯器不知道具體的例項型別,而geta則可以呼叫,用父類a接收就行。

2.pair<? super a>萬用字元超型別限定

? super a geta();

void seta(? super a

a);不能呼叫geta, 因為編譯器不知道具體的父型別是什麼, 而seta則可以呼叫,a型別的例項及其子類例項均可以使用a型別的父類呼叫。

3.pair<?>無限定萬用字元

? get()

void

set(?)

get的值只能賦值給object,set不能呼叫

Java 泛型總結

泛型指引數化型別的能力,可以定義帶泛型型別的類或方法,隨後編譯器會用具體的型別來替換它。在泛型產生之前,像集合的訪問都是靠強制型別轉換 public class arraylist public void add object o string filename string names.get 0...

Java泛型總結

1 泛型主要是用來年解決資料型別安全的問題,用標識來代替屬性的型別或者返回值的型別 2 在使用泛型的時候可以有以下幾種形式 泛型介面 泛型類 萬用字元做泛型引數 泛型方法 泛型陣列 3 以下通過 說明 package com.sun.demo 一 定義泛型介面 inte ce father 二 定義...

java泛型總結

1.概念 泛型實現了引數化型別的概念,其最初的目的是希望類或方法能夠具備最廣泛的表達能力。通俗來說就是為了避免轉換出錯,限制資料型別。通過解耦類或者方法與所使用的型別之間的約束。list thelist1 new arraylist arrays.aslist 1,2,3,string for ob...