日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java泛型中的多态

發布時間:2023/12/3 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java泛型中的多态 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

從作為Java程序員的早期開始,我們都知道如何實例化和使用Collection對象。 實例化為具體類的List接口將如下所示。

List myArrayList = new ArrayList();

如果myArrayList應該僅保存Integer對象,則從Java 5編譯器開始,按照Java Generics規范,實例化將如下所示:

List<Integer> myArrayList = new ArrayList<Integer>();

在同一行中,接受和/或返回字符串列表的方法將從

public List processStrings(ArrayList myStringList);

public List<String> processStrings(ArrayList<String> myStringList);

而且它們是類型安全的,因此我們不必進行強制轉換即可檢索列表對象的項目

String aStringFromMyStringList = myStringList.get(0); //No ClassCastException possible.

如果將aStringFromMyStringList聲明為String以外的任何內容,則以上內容將不會編譯。

到這里為止,我們應該對面向對象的Java如何工作感到滿意,但是下一項可能會讓很多人感到驚訝。

當我們使用List<Integer> myArrayList = new ArrayList<Integer>(); 意味著我們應該只在ArrayList和NOTHING ELSE中使用“ Integer”。 等一下,泛型不是OOP的一部分,這意味著我們不能在這些對象中應用多態嗎? 答案是不。 讓我們看看為什么。

我們已經看到多態性適用于集合的基本類型,這就是為什么List<Integer> myArrayList可以實例化為新的ArrayList<Integer>();

但是呢:

class Parent{}class Child extends Parent{}

使用以上方法,以下實例將無法正常工作,并最終導致編譯錯誤。

List<Parent> myList = new ArrayList<Child>() //Compilation Error;

一個簡單的規則是變量聲明的類型必須與您傳遞給實際對象類型的類型相匹配。 如果我們聲明List<Parent> myList那么我分配給myList任何myList必須僅是<Parent>類型,而不是Parent類的子類型,而不是Parent類的超類型。

這意味著正確的代碼是:

List<Parent> myList = new ArrayList<Parent>(); // Compiles fine

但是以上內容與習慣于使用以下合法內容的傳統Java程序員矛盾。

Parent[] myParentArray = new Child[10];

要詳細了解上述差異,讓我們有一個如下的繼承結構:

public class Animal{}public class Cat extends Animal{}public class Dog extends Animal{}

我們可以在數組中實現多態,因為不應將數組指定為安全類型。 請參見下面的數組示例,以及為什么我們需要將類型安全列表作為Collection對象。

public void addAnimals(Animal[] animals ) {animals [0] = new Animal();// If passed animal[] is of type Dog[] then we are adding a Cat object to a Dog[] array.animals [1] = new Cat();// If passed animal[] is of type Cat[] then we are adding a Dog object to a cat[] array.animals [1] = new Dog(); }

由于貓或狗是動物的類型,因此可以將貓陣列或狗陣列作為動物陣列進行傳遞。

public class callerClass() {Animal[] animalArray = new Animal[10];Cat[] catArray = new Cat[10];Dog[] dogArray = new Dog[10];addAnimals(animalArray); //Expected, no questions raised here. addAnimals(catArray); //As Cat[] is a type of Animal[] so we may end up in adding a Cat in Dog Array. addAnimals(dogArray); // As Dog[] is a type of Animal[] so if Cat[] is passed we may end up in adding a Dog in a //Cat array. }

但是看看如果我們使用Collections會發生什么。 我們可以有類似上面的方法:

public void addAnimals(List<Animal> myAnimalList()) { //Some code here. }

調用上述方法的調用方方法如下所示。

public class callerClass() {List<Animal> animalList = new ArrayList<Animal>();List<Cat> catList = new ArrayList<Cat>();List<Dog> dogList = new ArrayList<Dog>();addAnimals(animalList); addAnimals(catList);addAnimals(dogList); }

如果我們嘗試編譯以上內容,會發生什么? 它將在addAnimals(catList);行失敗addAnimals(catList); 和addAnimals(dogList) ,因為List類型與addAnimals(List<Animal> myAnimalList())方法的預期列表類型不匹配。 該方法期望列表僅聲明為動物類型。

盡管上面的方法失敗了,但是當列表被聲明為超類型列表時,泛型實際上可以保留子類型的實例。 例如,我們可以像下面這樣詳細實現addAnimals( List<Animal> myAnimalList () myAnimalList List<Animal> myAnimalList () )方法。

public void addAnimals(List<Animal> myAnimalList ()) {aList.add(new Animal()); // Expected code.aList.add(new Cat()); //Yes this works.aList.add(new Dog()); //Any Animal subtype works. }

這意味著我們可以將子超類繼承概念應用到對象列表中,而不是將對象作為方法參數分配或傳遞給列表。

這就是Java禁止編譯addAnimals(catList)代碼的原因,因為如果編譯了該代碼,則稍后在已實現的addAnimals方法中,即使aList是一個aList,也始終可以使用aList.add(new Dog())代碼。貓名單的類型,這是錯誤的! 我們不能將Dog對象添加到Cat列表中,因為該列表僅聲明為具有Cat對象(或其子類)。 泛型可以使列表類型安全并且在技術上有意義。 為了接受多態子/超類,我們可以使用通配符來增強方法簽名,這可以在另一個會話中進行討論。

翻譯自: https://www.javacodegeeks.com/2015/03/polymorphism-in-java-generics.html

總結

以上是生活随笔為你收集整理的Java泛型中的多态的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av鲁丝一区鲁丝二区鲁丝 | 国产精自产拍久久久久久蜜 | 欧美激情 在线 | 人人爱爱| 亚洲一区二区三区高清在线 | 99国产视频在线 | 性生交大片免费看3p | 国产香蕉精品 | 成人久久18免费网站图片 | 久久视频精品 | 亚洲色妞| 国产av 一区二区三区 | 殴美一区二区 | 红猫大本营在线观看的 | 国产精品久久久久久中文字 | 日本黄色网络 | 女人色极品影院 | 波多野结av衣东京热无码专区 | 色射影院| 黄色片网站免费在线观看 | 久久免费公开视频 | 中文字幕一区二区人妻在线不卡 | 影音先锋蜜桃 | 久久久天天 | 黄色欧美一级片 | 国产三区在线播放 | 九九九亚洲 | 蜜桃av免费看 | 日批大全| 国产又色又爽又黄的 | 久久久久久中文 | 在线黄色免费 | 中文字幕五区 | 天堂а√在线中文在线 | 毛片毛片| 久久亚洲网 | 欧美最猛黑人xxxx | 在线视频观看免费 | 国产精品久久久久久白浆 | 欧美在线视频免费播放 | 农村少妇无套内谢粗又长 | 亚洲人xxx日本人18 | av无毛 | 欧洲女同同性吃奶 | 亚洲欧洲免费 | 夜夜躁狠狠躁日日躁 | 98自拍视频 | 久久av高潮av | 免费伊人 | 亚洲精品久久久久国产 | 欧美性猛交xxxx乱大交hd | 久久看片| 日韩成人在线视频观看 | 老司机在线免费视频 | 日本在线资源 | 韩日一区二区三区 | 91精品国产乱码久久久 | 日韩美女久久 | 日韩激情国产 | 国产麻豆一区二区三区在线观看 | 欧美日韩综合在线 | 国产精品一区二区三 | 在线一级片 | 欧美三级在线观看视频 | 国产毛片aaa| 依人在线 | 精品婷婷 | 男男全肉变态重口高h | 成人视屏在线 | wwwxxxxx日本| 亚洲视频h| 精品动漫一区二区三区在线观看 | 深爱激情久久 | 亚洲永久无码精品一区二区 | 免费在线日韩 | 波多野结衣在线电影 | 羞羞色视频| 色婷婷香蕉在线一区二区 | 亚洲天堂2015 | 国产.com | 国产三级短视频 | 亚洲无套 | 久草久草 | 黄色一大片 | 自拍偷拍第5页 | xxxx69视频| 草草影院在线 | 爱情岛亚洲论坛入口福利 | 91丨porny在线 | 特黄一级片| 日韩欧美综合在线 | 加勒比视频在线观看 | 天天干天天操天天玩 | a v免费视频| 国产黄色片子 | 99国产在线播放 | 精品无码久久久久久久 | 五月天中文字幕 | 在线观看亚洲免费视频 |