亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

一、定義

1、T 代表一種類(lèi)型

可以加在類(lèi)上,也可以加在方法上

1)T 加在類(lèi)上

class SuperClass<A>{
	//todo
}

2)T 加在方法上

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

說(shuō)明:

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

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

擴(kuò)展:

如果有泛型方法和非泛型方法,都滿(mǎn)足條件,會(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、?是通配符,泛指所有類(lèi)型

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

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

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

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

若不用?,用固定的類(lèi)型的話,則:

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類(lèi)型
List<String> getStringList(){
  return dao.getList();//dao是一個(gè)實(shí)現(xiàn)類(lèi)實(shí)例
}

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

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

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

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

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

2、<?> 的限制用途

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

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

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

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

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

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

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

3、三種泛型限定

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

三、總結(jié)

1、從定義上看

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

2、從用途上看

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

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

第二,使用泛型類(lèi)或泛型方法。

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

無(wú)界通配符“<?>”主要用于第二種,使用泛型類(lèi)或泛型方法

補(bǔ)充:場(chǎng)景

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

泛型的限定:

  • ? extends E:接收E類(lèi)型或者E的子類(lèi)型。
  • ?super E:接收E類(lèi)型或者E的父類(lèi)型。

到此這篇關(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)論