泛型通配符
泛型通配符
當(dāng)使用泛型類或者接口時(shí),傳遞的數(shù)據(jù)中,泛型類型不確定,可以通過(guò)通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object類中的共性方法,集合中元素自身方法無(wú)法使用。
通配符基本使用
泛型的通配符:不知道使用什么類型來(lái)接收的時(shí)候,此時(shí)可以使用?,?表示未知通配符。
此時(shí)只能接受數(shù)據(jù),不能往該集合中存儲(chǔ)數(shù)據(jù)。
舉個(gè)例子大家理解使用即可:
public static void main(String[] args) {Collection<Intger> list1 = new ArrayList<Integer>();getElement(list1);Collection<String> list2 = new ArrayList<String>();getElement(list2); } public static void getElement(Collection<?> coll){} //?代表可以接收任意類型tips:泛型不存在繼承關(guān)系 Collection<Object> list = new ArrayList<String>();這種是錯(cuò)誤的。
package com.learn.demo03.Generic;import java.util.ArrayList; import java.util.Iterator;/*泛型的通配符:?:代表任意的數(shù)據(jù)類型使用方式:不能創(chuàng)建對(duì)象使用只能作為方法的參數(shù)使用*/ public class Demo05Generic {public static void main(String[] args) {ArrayList<Integer> list01 = new ArrayList<>();list01.add(1);list01.add(2);ArrayList<String> list02 = new ArrayList<>();list02.add("a");list02.add("b");printArray(list01);printArray(list02);//ArrayList<?> list03 = new ArrayList<?>();}/*定義一個(gè)方法,能遍歷所有類型的ArrayList集合這時(shí)候我們不知道ArrayList集合使用什么數(shù)據(jù)類型,可以泛型的通配符?來(lái)接收數(shù)據(jù)類型注意:泛型沒(méi)有繼承概念的*/public static void printArray(ArrayList<?> list){//使用迭代器遍歷集合Iterator<?> it = list.iterator();while(it.hasNext()){//it.next()方法,取出的元素是Object,可以接收任意的數(shù)據(jù)類型Object o = it.next();System.out.println(o);}} }通配符高級(jí)使用----受限泛型
之前設(shè)置泛型的時(shí)候,實(shí)際上是可以任意設(shè)置的,只要是類就可以設(shè)置。但是在JAVA的泛型中可以指定一個(gè)泛型的上限和下限。
泛型的上限:
-
格式: 類型名稱 <? extends 類 > 對(duì)象名稱
-
意義: 只能接收該類型及其子類
泛型的下限:
-
格式: 類型名稱 <? super 類 > 對(duì)象名稱
-
意義: 只能接收該類型及其父類型
比如:現(xiàn)已知Object類,String 類,Number類,Integer類,其中Number是Integer的父類
package com.learn.demo03.Generic;import java.util.ArrayList; import java.util.Collection;/*泛型的上限限定: ? extends E 代表使用的泛型只能是E類型的子類/本身泛型的下限限定: ? super E 代表使用的泛型只能是E類型的父類/本身*/ public class Demo06Generic {public static void main(String[] args) {Collection<Integer> list1 = new ArrayList<Integer>();Collection<String> list2 = new ArrayList<String>();Collection<Number> list3 = new ArrayList<Number>();Collection<Object> list4 = new ArrayList<Object>();getElement1(list1);//getElement1(list2);//報(bào)錯(cuò)getElement1(list3);//getElement1(list4);//報(bào)錯(cuò)//getElement2(list1);//報(bào)錯(cuò)//getElement2(list2);//報(bào)錯(cuò)getElement2(list3);getElement2(list4);/*類與類之間的繼承關(guān)系Integer extends Number extends ObjectString extends Object*/}// 泛型的上限:此時(shí)的泛型?,必須是Number類型或者Number類型的子類public static void getElement1(Collection<? extends Number> coll){}// 泛型的下限:此時(shí)的泛型?,必須是Number類型或者Number類型的父類public static void getElement2(Collection<? super Number> coll){} }?
總結(jié)
- 上一篇: 定义和使用含有泛型的接口
- 下一篇: 斗地主案例的需求分析