Java中泛型的接口、通配符使用詳解
Java中的泛型
泛型應(yīng)用類型
泛型定義時(shí)常用方式有三種(可參考List<E>,Map<K,V)等接口定義):
- 泛型類:class 類名<泛型,…>{}
- 泛型接口:interface 接口名<泛型,…>{}
- 泛型方法: <泛型> 方法返回值類型 方法名(形參){}
1 -定義
編譯時(shí)的類型安全監(jiān)測(cè)機(jī)制,也可以把這個(gè)數(shù)據(jù)類型理解成是一種可以傳遞的參數(shù)
泛型類、泛型方法、泛型接口
2 - 泛型定義格式
<類型>:表示一種類型的格式
<類型1,類型2......> :表示是多種類型的格式,用逗號(hào)分割
class Array<T>{//類泛型:類名<泛型>
Object[] array=new Object[10];
public void add(T t){}//通過類泛型約束方法參數(shù)類型
public T get(int i){//通過類泛型約束方法返回值類型
return (T)array[i];
}
}3 - 使用泛型的好處
- 把運(yùn)行期間可能出現(xiàn)的問題,拿到編譯期間(錯(cuò)誤等級(jí)的提升)
- 避免強(qiáng)制類型轉(zhuǎn)換丟失精度等問題的出現(xiàn)
4 - 泛型類
/**
* @author Mr.樂
* @Description 泛型類
* E - Element
* K - Key
* T - Type
* V - Value
*/
public class Generic<T> {
//這個(gè)成員變量的類型為T,T的類型由外部指定
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
-------------------------------------
/**
* @author Mr.樂
* @Description 泛型類測(cè)試類
*/
public class Demo01 {
public static void main(String[] args) {
Generic<String> strG = new Generic<>();//創(chuàng)建泛型類對(duì)象
strG.setT("我是一個(gè)字符串!~");
System.out.println(strG.getT());
Generic<Integer> intG = new Generic<>();
intG.setT(1314);
System.out.println(intG.getT());
}
}5 -泛型方法
/**
* @author Mr.樂
* @Description
*/
public class Generic {
//泛型方法
/*public <T> void show(T i) {
System.out.println(i);
}*/
//有返回值類型的泛型方法
public <T> T show(T i) {
return i;
}
}
-----------------------------
/**
* @author Mr.樂
* @Description
*/
public class Demo02 {
public static void main(String[] args) {
Generic g = new Generic();//創(chuàng)建泛型方法類的對(duì)象
System.out.println(g.show(1314));
g.show("String");
g.show(3.14f);
g.show(new Student("Andy",18));
}
}6 - 泛型接口
/**
* @author Mr.樂
* @Description
*/
public interface Generic <T>{
void show(T t);
}
----------------------------------
/**
* @author Mr.樂
* @Description
*/
public class GenericImpl <T> implements Generic<T>{
@Override
public void show(T t) {
System.out.println("我是實(shí)現(xiàn)類中的show方法:" + t);
}
}
---------------------------------------------------------------------
/**
* @author Mr.樂
* @Description
*/
public class Demo03 {
public static void main(String[] args) {
GenericImpl<String> strG = new GenericImpl<>();
strG.show("字符串");
//通過匿名內(nèi)部類實(shí)現(xiàn)
new Generic<Integer>() {
@Override
public void show(Integer integer) {
System.out.println("我是匿名內(nèi)部類的show方法" + integer);
}
}.show(1314);
}
}7 - 泛型通配符
import java.util.ArrayList;
/**
* @author Mr.樂
* @Description 泛型通配符
*/
public class demo04 {
public static void main(String[] args) {
//<?> 通配所有 相當(dāng)于Object
ArrayList<?> list01 = new ArrayList<Object>();
ArrayList<?> list02 = new ArrayList<Integer>();//Integer為Object子類
ArrayList<?> list03 = new ArrayList<Float>();
ArrayList<?> list04 = new ArrayList<Number>();
//<? extends Number> 上限 ??jī)H為Number類及子類
ArrayList<? extends Number> list05 = new ArrayList<Number>();
ArrayList<? extends Number> list06 = new ArrayList<Integer>();
ArrayList<? extends Number> list07 = new ArrayList<Float>();
// ArrayList<? extends Number> list08 = new ArrayList<String>();
//<? super Number> 下限 ??jī)H為Number類及父類
ArrayList<? super Number> list09 = new ArrayList<Number>();
// ArrayList<? super Number> list10 = new ArrayList<Integer>();
// ArrayList<? super Number> list11 = new ArrayList<String>();
ArrayList<? super Number> list12 = new ArrayList<Object>();
}
}8 - 泛型通配符的基本應(yīng)用
import java.util.ArrayList;
/**
* @author Mr.樂
* @Description 泛型通配符的基本應(yīng)用
*/
public class Demo05 {
public static void main(String[] args) {
ArrayList<String> strList = new ArrayList<>();
show(strList);
// showUp(strList);
// showDown(strList);
ArrayList<Integer> intList = new ArrayList<>();
show(intList);
showUp(intList);
// showDown(intList);
ArrayList<Number> numList = new ArrayList<>();
show(numList);
showUp(numList);
showDown(numList);
ArrayList<Object> objList = new ArrayList<>();
show(objList);
// showUp(objList);
showDown(objList);
}
//<?> 表示通配所有
private static void show(ArrayList<?> list){
}
//表示上限
private static void showUp(ArrayList<? extends Number> list){
}
//表示下限
private static void showDown(ArrayList<? super Number> list){
}
}總結(jié)
泛型,大家用到最多的就是在集合中,在實(shí)際的開發(fā)過程中,自己可以使用泛型去簡(jiǎn)化開發(fā),保證同種類型,能很好的保證代碼質(zhì)量。
到此這篇關(guān)于Java中泛型的接口、通配符使用詳解的文章就介紹到這了,更多相關(guān)Java中的泛型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中增強(qiáng)for循環(huán)在一維數(shù)組和二維數(shù)組中的使用方法
下面小編就為大家?guī)硪黄狫ava中增強(qiáng)for循環(huán)在一維數(shù)組和二維數(shù)組中的使用方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10
Netty源碼分析NioEventLoop初始化線程選擇器創(chuàng)建
這篇文章主要介紹了Netty源碼分析NioEventLoop初始化線程選擇器創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
Guava事件總線應(yīng)用場(chǎng)景最佳實(shí)踐
這篇文章主要為大家介紹了Guava事件總線應(yīng)用場(chǎng)景最佳實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
詳解springcloud之服務(wù)注冊(cè)與發(fā)現(xiàn)
本次分享的是關(guān)于springcloud服務(wù)注冊(cè)與發(fā)現(xiàn)的內(nèi)容,將通過分別搭建服務(wù)中心,服務(wù)注冊(cè),服務(wù)發(fā)現(xiàn)來說明,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-06-06
Java即將引入新對(duì)象類型來解決內(nèi)存使用問題
這篇文章主要介紹了Java即將引入新對(duì)象類型來解決內(nèi)存使用問題,文章通過圍繞主題的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
java常用數(shù)據(jù)流應(yīng)用實(shí)例解析
這篇文章主要介紹了java常用數(shù)據(jù)流應(yīng)用實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
springboot+springJdbc+postgresql 實(shí)現(xiàn)多數(shù)據(jù)源的配置
本文主要介紹了springboot+springJdbc+postgresql 實(shí)現(xiàn)多數(shù)據(jù)源的配置,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Springboot實(shí)現(xiàn)Excel批量導(dǎo)入數(shù)據(jù)并保存到本地
這篇文章主要為大家詳細(xì)介紹了Springboot實(shí)現(xiàn)Excel批量導(dǎo)入數(shù)據(jù)并將文件保存到本地效果的方法,文中的示例代講解詳細(xì),需要的可以參考一下2022-09-09

