欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java泛型中<?>和<T>的區(qū)別淺析

 更新時間:2022年12月19日 09:58:42   作者:格子衫111  
<T>和<?>的區(qū)別 <T>是參數(shù)類型,常常用于泛型類或泛型方法的定義,下面這篇文章主要給大家介紹了關(guān)于Java泛型中<?>和<T>區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、定義

1、T 代表一種類型

可以加在類上,也可以加在方法上

1)T 加在類上

class SuperClass<A>{
	//todo
}

2)T 加在方法上

public <T>void fromArrayToList(T[] arr, List<T> list){
 	//todo
}

說明:

> 上面方法上的<T>代表括號里面要用到泛型參數(shù),若類中傳了泛型,此處可以不傳,
> 調(diào)用類型上面的泛型參數(shù),前提是方法中使用的泛型與類中傳來的泛型一致, 
  如下所示:
  /**
 * 類上的 泛型T 和 方法中的參數(shù)相同,
 * 所以方法的返回值處 可以 不加<T>
 */
class SuperClass<T>{

  public void fromArrayToList(T[] arr, List<T> list){
    //todo
  }
  
}

擴(kuò)展:

如果有泛型方法和非泛型方法,都滿足條件,會執(zhí)行非泛型方法

	//非泛型方法
	public void show(String s){

      System.out.println("1");

   }
	
	//泛型方法
   @Override
   public void show(T a) {

      System.out.println("2");

   }

如上示例,調(diào)用show方法時,因?yàn)榉欠盒头椒ù嬖?,會?yōu)先執(zhí)行show(String s)方法

2、?是通配符,泛指所有類型

一般用于定義一個引用變量

SuperClass<?> sup = new SuperClass<String>("lisi");

sup = new SuperClass<People>(new People());

sup = new SuperClass<Animal>(new Animal());

若不用?,用固定的類型的話,則:

SuperClass<String> sup1 = new SuperClass<String>("lisi");

SuperClass<People> sup2 = new SuperClass<People>;

SuperClass<Animal> sup3 = new SuperClass<Animal>;

這就是 ? 通配符的好處:定義一個sup的引用變量,就可以指向多個對象。

二、使用

1、T 一般有兩種用途

1) 定義一個通用的泛型方法

// Dao 定義1個通用的泛型方法getList
public interface Dao{
  List<T> getList(){};
}
 
// 使用 Dao的泛型方法getList 返回String類型
List<String> getStringList(){
  return dao.getList();//dao是一個實(shí)現(xiàn)類實(shí)例
}

// 使用 Dao的泛型方法getList 返回Integer類型
List<Integer> getIntList(){
  return dao.getList();
}

PS:上面接口的getList方法如果定義成List<?> ,后面就會報(bào)錯。

2) 限制方法的參數(shù)之間或參數(shù)和返回結(jié)果之間的關(guān)系

// 限制參數(shù) param1、param2、返回值都是T類型
List<T> getList<T param1,T param2>

這樣可以限制返回結(jié)果的類型以及兩個參數(shù)的類型一致

2、<?> 的限制用途

<?> 一般就是在泛型起一個限制作用,如下示例:

// 定義1個父類Fruit
public Class Fruit(){}

// 定義1個子類Apple,繼承Fruit
public Class Apple extends Fruit(){}

// 定義1個方法test,限制參數(shù)類型只能是 Fruit 或 Fruit的子類
public void test(? extends Fruit){
	//todo
};

/** 以下是調(diào)用 */
test(new Fruit()); // 傳參為 父類Fruit

test(new Apple()); // 傳參為 父類Fruit的子類Apple

test(new String()); //這個會報(bào)錯, 因?yàn)槎x方法的傳參,限制死了

3、三種泛型限定

ArrayList<T> al=new ArrayList<T>(); //指定集合元素只能是T類型
ArrayList<? extends E> al=new ArrayList<? extends E>(); //指定集合元素只能是E類型或者E的子類型
ArrayList<? super E> al=new ArrayList<? super E>(); //指定集合元素只能是E類型或者E的父類型

三、總結(jié)

1、從定義上看

T和?定義的地方有點(diǎn)不同,?是定義在引用變量上,T是類上或方法上

2、從用途上看

“T>“和”<?>”,首先要區(qū)分開兩種不同的場景:

第一,聲明一個泛型類或泛型方法;

第二,使用泛型類或泛型方法。

類型參數(shù)“T>”主要用于第一種,聲明泛型類或泛型方法

無界通配符“<?>”主要用于第二種,使用泛型類或泛型方法

補(bǔ)充:場景

ArrayList al=new ArrayList();指定集合元素只能是T類型
ArrayList<?> al=new ArrayList<?>();集合元素可以是任意類型,這種沒有意義,一般是方法中,只是為了說明用法
ArrayList<? extends E> al=new ArrayList<? extends E>();

泛型的限定:

  • ? extends E:接收E類型或者E的子類型。
  • ?super E:接收E類型或者E的父類型。

到此這篇關(guān)于Java泛型中<?>和<T>區(qū)別的文章就介紹到這了,更多相關(guān)Java泛型&lt;?&gt;和&lt;T&gt;區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決啟用 Spring-Cloud-OpenFeign 配置可刷新項(xiàng)目無法啟動的問題

    解決啟用 Spring-Cloud-OpenFeign 配置可刷新項(xiàng)目無法啟動的問題

    這篇文章主要介紹了解決啟用 Spring-Cloud-OpenFeign 配置可刷新項(xiàng)目無法啟動的問題,本文重點(diǎn)給大家介紹Spring-Cloud-OpenFeign的原理及問題解決方法,需要的朋友可以參考下
    2021-10-10
  • Java編程調(diào)用微信支付功能的方法詳解

    Java編程調(diào)用微信支付功能的方法詳解

    這篇文章主要介紹了Java編程調(diào)用微信支付功能的方法,結(jié)合實(shí)例形式詳細(xì)分析了java微信支付功能的原理、操作流程及相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08
  • Java中BigDecimal,DateFormatter?和迭代器的"陷阱"

    Java中BigDecimal,DateFormatter?和迭代器的"陷阱"

    這篇文章主要介紹了Java中BigDecimal,DateFormatter?和迭代器的"陷阱",文章圍繞主題展開詳細(xì)的內(nèi)容介紹,感興趣的小伙伴可以參考一下
    2022-06-06
  • 詳解SpringBoot啟動代碼和自動裝配源碼分析

    詳解SpringBoot啟動代碼和自動裝配源碼分析

    這篇文章主要介紹了SpringBoot啟動代碼和自動裝配源碼分析,使用SpringBoot很簡單,在主類中添加一個@SpringBootApplication,以及調(diào)用SpringApplication.run()并傳入主類,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • java開發(fā)之MD5加密算法的實(shí)現(xiàn)

    java開發(fā)之MD5加密算法的實(shí)現(xiàn)

    本篇文章介紹了,java開發(fā)之MD5加密算法的實(shí)現(xiàn)。需要的朋友參考下
    2013-05-05
  • Apache?Commons?CLI構(gòu)建命令行應(yīng)用利器教程

    Apache?Commons?CLI構(gòu)建命令行應(yīng)用利器教程

    這篇文章主要為大家介紹了構(gòu)建命令行應(yīng)用利器Apache?Commons?CLI的使用教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • spring事務(wù)異?;貪L實(shí)例解析

    spring事務(wù)異?;貪L實(shí)例解析

    這篇文章主要介紹了spring事務(wù)異常回滾實(shí)例解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Java replaceAll()方法報(bào)錯Illegal group reference的解決辦法

    Java replaceAll()方法報(bào)錯Illegal group reference的解決辦法

    這篇文章主要給大家介紹了關(guān)于Java replaceAll()方法報(bào)錯Illegal group reference的解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java SSM配置文件案例詳解

    Java SSM配置文件案例詳解

    這篇文章主要介紹了Java SSM配置文件案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • java中接口(interface)及使用方法示例

    java中接口(interface)及使用方法示例

    這篇文章主要介紹了java中接口(interface)及使用方法示例,涉及接口定義的簡單介紹以及Java語言代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-11-11

最新評論