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

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

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

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

擴(kuò)展:

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

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

      System.out.println("1");

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

      System.out.println("2");

   }

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

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

一般用于定義一個(gè)引用變量

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

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

二、使用

1、T 一般有兩種用途

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

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

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

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

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

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

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

2、<?> 的限制用途

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

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

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

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

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

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

test(new String()); //這個(gè)會(huì)報(bào)錯(cuò), 因?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ū)分開兩種不同的場景:

第一,聲明一個(gè)泛型類或泛型方法;

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

類型參數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論