Java中泛型總結(jié)(推薦)
Java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型提供了編譯時類型安全檢測機制,該機制允許程序員在編譯時檢測到非法的類型。
泛型的本質(zhì)是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個參數(shù)。
泛型類
范例:泛型類的基本語法
class MyClass<T> {
T value1;
}
尖括號 <> 中的 T 被稱作是類型參數(shù),用于指代任何類型。實際上這個T你可以任意寫,但出于規(guī)范的目的,Java還是建議我們用單個大寫字母來代表類型參數(shù)。常見的如:
- T 代表一般的任何類。
- E 代表 Element 的意思,或者 Exception 異常的意思。
- K 代表 Key 的意思
- V 代表 Value 的意思,通常與 K 一起配合使用。
- S 代表 Subtype 的意思,文章后面部分會講解示意。
范例:泛型類引入多個類型參數(shù)以及使用
class MyClass<T,E> {
T value1;
E value2;
}
public class Test {
public static void main(String[] args) {
MyClass<String,Integer> myClass1 = new MyClass<String,Integer>();
}
}
當開發(fā)的程序可以避免向下轉(zhuǎn)型,也就意味著安全隱患被消除了。盡量不要去使用向下轉(zhuǎn)型。
泛型的出現(xiàn)徹底改變了向下轉(zhuǎn)型的需求。引入泛型后,如果明確設(shè)置了類型,則為設(shè)置類型;如果沒有設(shè)置類型,
則默認為Object類型。
泛型方法
泛型不僅可以用于定義類,還可以單獨來定義方法。如下所示:
范例:泛型方法定義
class MyClass{
public <T> void testMethod(T t) {
System.out.println(t);
}
}
泛型方法與泛型類稍有不同的地方是,類型參數(shù)也就是尖括號那一部分是寫在返回值前面的。 中的 T 被稱為類型參數(shù),而方法中的 T 被稱為參數(shù)化類型,它不是運行時真正的參數(shù)。
當然,聲明的類型參數(shù),其實也是可以當作返回值的類型的。
范例:使用類型參數(shù)做返回值的泛型方法
class MyClass{
public <T> T testMethod(T t) {
return t;
}
}
在程序類中追加了泛型的定義后,避免了ClassCastException 的問題,但是又會產(chǎn)生新的情況:參數(shù)的統(tǒng)一問題。
范例:觀察程序
public class TestDemo {
public static void main(String[] args) {
Message<Integer> message = new Message() ;
message.setMessage(99);
fun(message); // 出現(xiàn)錯誤,只能接收String
}
public static void fun(Message<String> temp){
System.out.println(temp.getMessage());
}
}
范例:使用通配符
public class TestDemo {
public static void main(String[] args) {
Message<Integer> message = new Message() ;
message.setMessage(55);
fun(message);
}
// 此時使用通配符"?"描述的是它可以接收任意類型,但是由于不確定類型,所以無法修改
public static void fun(Message<?> temp){
//temp.setMessage(100); 無法修改!
System.out.println(temp.getMessage());
}
}
泛型接口
泛型除了可以定義在類中,也可以定義在接口里面,這種情況我們稱之為泛型接口。
范例:定義一個泛型接口
interface IMessage<T> {
// 在接口上定義了泛型
public void print(T t) ;
}
范例:在子類定義時繼續(xù)使用泛型
interface IMessage<T> {
// 在接口上定義了泛型
public void print(T t) ;
}
class MessageImpl<T> implements IMessage<T> {
@Override
public void print(T t) {
System.out.println(t);
}
}
public class TestDemo {
public static void main(String[] args) {
IMessage<String> msg = new MessageImpl() ;
msg.print("Hello World");
}
}
以后我們編寫的程序一定會使用泛型接口,要求大家一定要掌握。
類型擦除
泛型是 Java 1.5 版本才引進的概念,在這之前是沒有泛型的概念的,但顯然,泛型代碼能夠很好地和之前版本的代碼很好地兼容。
這是因為,泛型信息只存在于代碼編譯階段,在進入 JVM 之前,與泛型相關(guān)的信息會被擦除掉,專業(yè)術(shù)語叫做類型擦除。
通俗地講,泛型類和普通類在 java 虛擬機內(nèi)是沒有什么特別的地方。
以上所述是小編給大家介紹的Java中泛型總結(jié)詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
java構(gòu)建OAuth2授權(quán)服務(wù)器
本文主要介紹了java構(gòu)建OAuth2授權(quán)服務(wù)器,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2021-07-07
一次排查@CacheEvict注解失效的經(jīng)歷及解決
這篇文章主要介紹了一次排查@CacheEvict注解失效的經(jīng)歷及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12

