<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
泛型機制在專案中一直都在使用,比如在集合中ArrayList<String, String>, Map<String,String>等,不僅如此,很多原始碼中都用到了泛型機制,所以深入學習瞭解泛型相關機制對於原始碼閱讀以及自己程式碼編寫有很大的幫助。但是裡面很多的機制和特性一直沒有明白,特別是萬用字元這塊,對於萬用字元上界、下界每次用每次百度,經常忘記,這次我就做一個總結,加深自己的理解。
泛型在類定義時不會設定類中的屬性或方法引數的具體型別,而是在類使用時(建立物件)再進行型別的定義。會在編譯期檢查型別是否錯誤, 保證程式的可讀性和安全性。
泛型定義根據實際情況可以分為泛型類和泛型方法:
public class Point<T, U> { private T pointX; private U pintY; public Point(T pointX, U pintY) { this.pointX = pointX; this.pintY = pintY; } public void showPoint() { System.out.println(pointX); System.out.println(pintY); } }
public class FxMethod { public static <T> T getMiddleNumber(T ... numbers) { return null; } public <T, U> void showNumber(T t, U u) { System.out.println("t = " + t); System.out.println("u = " + u);; } }
Integer result = FxMethod.getMiddleNumber(2, 3)
或者 Integer result = FxMethod.<Integer>getMiddleNumber(2, 3)
。前面講解了泛型一般定義的兩種方式,其中的型別變數沒有任何限定, 這樣在導致一方面在定義泛型的時候無法使用一些API, 需要強轉,另一方面在使用的時候也容易出錯,那麼如何給型別變數新增限定呢?
T extends Number & Comparable
。泛型的引入的確解決了很大問題,那它是完美的嗎?
class AnimalWrapper<T extends Animal> { private T animal; AnimalWrapper(T animal) { this.animal = animal; } public void eat() { animal.eat(); } } class Animal { private String name; public void eat() { System.out.println("animal eat -----"); } } class Cat extends Animal { @Override public void eat() { System.out.println(" cat eat -----"); } }
定義一個AnimalWrapper,泛型變數中限定為Animal,如果是下面的測試類,會怎麼樣呢?
會編譯報錯,因為AnimalWrapper並不是AnimalWrapper的子類,不能直接傳入。為了解決個問題,我們引入了萬用字元,萬用字元一般是在方法中或者泛型類使用中用到。
AnimalWrapper可以作為AnimalWrapper<?extends Animal>的子型別,這就是利用萬用字元帶來的好處。
萬用字元無邊界,可以傳入任何型別,沒有限制,相當於Object.
基本語法:
<?>
例子:
public static void printList1(List<?> list) { for (Object x:list) { System.out.println(x); } } public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(1); printList1(list); // ok List<String> list2 = new ArrayList<>(); list2.add("1"); printList1(list2); // ok List<?> list3 = list; // get只能用Object接受, Object o = list3.get(0); list3.add(5); // compile error list3.add(new Object()); // compile error }
小結:
List<Integer> list, List<String> list2
。Object o = list3.get(0);
萬用字元上界,可以限制傳入的型別必須是上界這個類或者是這個類的子類。
基本語法:
<? extends 上界> <? extends Number>//可以傳入的實參型別是Number或者Number的子類
例子:
public static void printList1(List<? extends Number> list) { for (Object x:list) { System.out.println(x); } } public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(1); printList1(list); // ok List<Double> list1 = new ArrayList<>(); list1.add(1.0D); printList1(list1); // ok List<String> list2 = new ArrayList<>(); list2.add("1"); printList1(list2); // compile error List<? extends Number> list3 = list; // get能用上界 Number o = list3.get(0); // 不能add list3.add(5); // compile error list3.add(new Object()); // compile error }
小結:
Number o = list3.get(0);
list3.add(5);
,5雖然是Number的子類,依然不能add。萬用字元下界,可以限制傳入的型別必須是這個類或者是這個類的父類別。
基本語法:
<? super 下界> <? super Integer>//代表 可以傳入的實參的型別是Integer或者Integer的父類別型別
例子:
public static void printList1(List<? super Integer> list) { for (Object x:list) { System.out.println(x); } } public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(1); printList1(list); // ok List<Double> list1 = new ArrayList<>(); list1.add(1.0D); printList1(list1); // compile error List<String> list2 = new ArrayList<>(); list2.add("1"); printList1(list2); // compile error List<? super Integer> list3 = list; // 不能用下界接收 Integer o = list3.get(0); // compile error // 能add list3.add(5); // ok list3.add(new Number(5)); // compile error }
Integer o = list3.get(0); // compile error
,比如例子中用Integer接收,萬一list3中放的是Object型別,就涼涼了。list3.add(5)
, list3的萬用字元是<? super Integer>
,說明該集合存放的是Integer或者Integer的父類別,我只要向容器中放Integer和它的子類都是成立的。到此這篇關於一文帶你搞懂Java中的泛型和萬用字元的文章就介紹到這了,更多相關Java泛型 萬用字元內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45