目錄
通配符的作用
????????先看一段代碼
????????用通配符"?"后,代碼變化
????????結(jié)論
通配符上界?
通配符下界
對通配符上下界的注釋理解及其練習(xí)代碼??
簡記: ? ?用于在泛型的使用,即為通配符.
在Java中,通配符(wildcard)主要用于泛型編程,用于表示一個不確定的類型。
通配符有三種形式:1.通配符<?>? 2.
通配符<? extends T>
? ?3. 通配符<? super T>
通配符的作用
先看一段代碼
class Test0 {
public static void main(String[] args) {
System.out.println("===========1.String==============");
Message<String> message1 = new Message<>();
message1.setMessage("fly in the sky!");
fun1(message1);
System.out.println("===========2.Integer=============");
Message<Integer> message2 = new Message<>();
message2.setMessage(99);
fun2(message2);
System.out.println("===========3.Character============");
Message<Character> message3 = new Message<>();
message3.setMessage('s');
func3(message3);
System.out.println("===========4.Short================");
Message<Short> message4 = new Message<>();
message4.setMessage((short) 213);
func4(message4);
System.out.println("===========5.Long=================");
Message<Long> message5 = new Message<>();
message5.setMessage(1024L);
func5(message5);
System.out.println("===========6.Float=================");
Message<Float> message6 = new Message<>();
message6.setMessage(3.1415926f);
func6(message6);
System.out.println("===========7.Double================");
Message<Double> message7 = new Message<>();
message7.setMessage(1024.0213);
func7(message7);
System.out.println("===========8.Boolean===============");
Message<Boolean> message8 = new Message<>();
message8.setMessage(true);
func8(message8);
}
public static void fun1(Message<String> tmp) {
System.out.println(tmp.getMessage());
}
public static void fun2(Message<Integer> tmp) {
System.out.println(tmp.getMessage());
}
public static void func3(Message<Character> tmp) {
System.out.println(tmp.getMessage());
}
public static void func4(Message<Short> tmp) {
System.out.println(tmp.getMessage());
}
public static void func5(Message<Long> tmp) {
System.out.println(tmp.getMessage());
}
public static void func6(Message<Float> tmp) {
System.out.println(tmp.getMessage());
}
public static void func7(Message<Double> tmp) {
System.out.println(tmp.getMessage());
}
public static void func8(Message<Boolean> tmp) {
System.out.println(tmp.getMessage());
}
}
用通配符"?"后,代碼變化
class Test1 {
public static void func(Message<?> temp) {
System.out.println(temp.getMessage());
}
public static void main(String[] args) {
System.out.println("===========1.String==============");
Message<String> message1 = new Message<>();
message1.setMessage("fly in the sky!");
func(message1);
System.out.println("===========2.Integer=============");
Message<Integer> message2 = new Message<>();
message2.setMessage(99);
func(message2);
System.out.println("===========3.Character============");
Message<Character> message3 = new Message<>();
message3.setMessage('s');
func(message3);
System.out.println("===========4.Short================");
Message<Short> message4 = new Message<>();
message4.setMessage((short) 213);
func(message4);
System.out.println("===========5.Long=================");
Message<Long> message5 = new Message<>();
message5.setMessage(1024L);
func(message5);
System.out.println("===========6.Float=================");
Message<Float> message6 = new Message<>();
message6.setMessage(3.1415926f);
func(message6);
System.out.println("===========7.Double================");
Message<Double> message7 = new Message<>();
message7.setMessage(1024.0213);
func(message7);
System.out.println("===========8.Boolean===============");
Message<Boolean> message8 = new Message<>();
message8.setMessage(true);
func(message8);
}
}
結(jié)論
結(jié)論:使用通配符"?"可以接收所有的泛型類型,從而大大減少代碼量,
?注:雖然通配符 "?" 可以接受任意類型,但正因為如此,由于不確定類型,所以在func方法中無法修改操作
在"?"的基礎(chǔ)上又產(chǎn)生了兩個子通配符:?
? extends 類:設(shè)置通配符上限 =>??通配符上界
? super 類:設(shè)置通配符下限 =>??通配符下界
通配符上界?
通配符上界
語法:
<? extends 上界>
<? extends String>//可以傳入的實參類型是String或者String的子類通配符的上界,不能進行寫入數(shù)據(jù),只能進行讀取數(shù)據(jù)
?通配符下界
通配符下界 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
語法:
<? super 下界>? ? ? ? ? ? ? ? ? ? ? ? ? ??
<? super ?Integer>//代表 可以傳入的實參的類型是 Integer或者 Integer的父類類型?通配符的下界,不能進行讀取數(shù)據(jù),只能寫入數(shù)據(jù)
class Food {
}
class Fruit extends Food {
}
class Apple extends Fruit {
}
class Banana extends Fruit {
}
文章來源:http://www.zghlxwxcb.cn/news/detail-684471.html
對通配符上下界的注釋理解及其練習(xí)代碼??
class Food {}
class Fruit extends Food {}
class Apple extends Fruit {}
class Banana extends Fruit {}
class Plate<T> {//設(shè)置泛型
private T message;
public T getMessage() {
return message;
}
public void setMessage(T message) {
this.message = message;
}
}
public class Test2 {
public static void main1(String[] args) {
Plate<Apple> applePlate = new Plate<>();
applePlate.setMessage(new Apple());
func1(applePlate);
Plate<Banana> bananaPlate = new Plate<>();
bananaPlate.setMessage(new Banana());
func1(bananaPlate);
}
//通配符的上界
//通配符的上界,不能進行寫入數(shù)據(jù),只能進行讀取數(shù)據(jù)
public static void func1(Plate<? extends Fruit> tmp) {
//這里仍然不可以進行修改!tmp接收的是Fruit和他的子類,此時存儲的元素應(yīng)該是哪個子類無法確定。
System.out.println(tmp.getMessage());
Fruit b = tmp.getMessage();//向上轉(zhuǎn)型
System.out.println(b);
}
//通配符的下界
//通配符的下界,不能進行讀取數(shù)據(jù),只能寫入數(shù)據(jù)
public static void main(String[] args) {
Plate<Fruit> fruitPlate = new Plate<>();
fruitPlate.setMessage(new Fruit());
func2(fruitPlate);
Plate<Food> foodPlate = new Plate<>();
foodPlate.setMessage(new Food());
func2(foodPlate);
}
public static void func2(Plate<? super Fruit> tmp) {
//傳入?yún)?shù)為Fruit及其父類 ,
//此時可以修改?。√砑拥氖荈ruit 或者Fruit的子類
tmp.setMessage(new Apple());
tmp.setMessage(new Fruit());
//不能接收,這里無法確定是哪個父類,父類太多了
}
}
??
?文章來源地址http://www.zghlxwxcb.cn/news/detail-684471.html
到了這里,關(guān)于了解java中的通配符“?“的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!