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

歡迎訪問 生活随笔!

生活随笔

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

java

java 泛型嵌套泛型_Java泛型简介–第6部分

發(fā)布時間:2023/12/3 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 泛型嵌套泛型_Java泛型简介–第6部分 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

java 泛型嵌套泛型

這是關于泛型的介紹性討論的延續(xù), 此處的先前部分可以在此處找到。

在上一篇文章中,我們討論了關于類型參數(shù)的遞歸邊界。 我們看到了遞歸綁定如何幫助我們重用了車輛比較邏輯。 在該文章的結尾,我建議當我們不夠謹慎時,可能會發(fā)生類型混合。 今天我們將看到一個例子。

如果有人錯誤地通過以下方式創(chuàng)建了Vehicle的子類,則可能會發(fā)生混合:

/*** Definition of Vehicle*/ public abstract class Vehicle<E extends Vehicle<E>> implements Comparable<E> {// other methods and propertiespublic int compareTo(E vehicle) {// method implementation} }/*** Definition of Bus*/ public class Bus extends Vehicle<Bus> {}/*** BiCycle, new subtype of Vehicle*/ public class BiCycle extends Vehicle<Bus> {}/*** Now this class’s compareTo method will take a Bus type* as its argument. As a result, you will not be able to compare* a BiCycle with another Bicycle, but with a Bus.*/ cycle.compareTo(anotherCycle); // This will generate a compile time error cycle.compareTo(bus); // but you will be able to do this without any error

枚舉不會發(fā)生這種類型的混淆,因為JVM負責子類化和為枚舉類型創(chuàng)建實例,但是如果我們在代碼中使用這種樣式,則必須小心。

讓我們談談遞歸邊界的另一個有趣的應用。 考慮以下類別:

public class MyClass {private String attrib1;private String attrib2;private String attrib3;private String attrib4;private String attrib5;public MyClass() {}public String getAttrib1() {return attrib1;}public void setAttrib1(String attrib1) {this.attrib1 = attrib1;}public String getAttrib2() {return attrib2;}public void setAttrib2(String attrib2) {this.attrib2 = attrib2;}public String getAttrib3() {return attrib3;}public void setAttrib3(String attrib3) {this.attrib3 = attrib3;}public String getAttrib4() {return attrib4;}public void setAttrib4(String attrib4) {this.attrib4 = attrib4;}public String getAttrib5() {return attrib5;}public void setAttrib5(String attrib5) {this.attrib5 = attrib5;} }

如果我們要創(chuàng)建此類的實例,則可以執(zhí)行以下操作:

MyClass mc = new MyClass(); mc.setAttrib1("Attribute 1"); mc.setAttrib2("Attribute 2");

上面的代碼創(chuàng)建該類的實例并初始化屬性。 如果我們可以在此處使用方法鏈接 ,那么我們可以編寫:

MyClass mc = new MyClass().setAttrib1("Attribute 1").setAttrib2("Attribute 2");

顯然比第一個版本好得多。 但是,要啟用這種方法鏈接,我們需要通過以下方式修改MyClass :

public class MyClass {private String attrib1;private String attrib2;private String attrib3;private String attrib4;private String attrib5;public MyClass() {}public String getAttrib1() {return attrib1;}public MyClass setAttrib1(String attrib1) {this.attrib1 = attrib1;return this;}public String getAttrib2() {return attrib2;}public MyClass setAttrib2(String attrib2) {this.attrib2 = attrib2;return this;}public String getAttrib3() {return attrib3;}public MyClass setAttrib3(String attrib3) {this.attrib3 = attrib3;return this;}public String getAttrib4() {return attrib4;}public MyClass setAttrib4(String attrib4) {this.attrib4 = attrib4;return this;}public String getAttrib5() {return attrib5;}public MyClass setAttrib5(String attrib5) {this.attrib5 = attrib5;return this;} }

然后我們將可以對此類的實例使用方法鏈接。 但是,如果我們想在涉及繼承的地方使用方法鏈接,那么事情就會變得混亂:

public abstract class Parent {private String attrib1;private String attrib2;private String attrib3;private String attrib4;private String attrib5;public Parent() {}public String getAttrib1() {return attrib1;}public Parent setAttrib1(String attrib1) {this.attrib1 = attrib1;return this;}public String getAttrib2() {return attrib2;}public Parent setAttrib2(String attrib2) {this.attrib2 = attrib2;return this;}public String getAttrib3() {return attrib3;}public Parent setAttrib3(String attrib3) {this.attrib3 = attrib3;return this;}public String getAttrib4() {return attrib4;}public Parent setAttrib4(String attrib4) {this.attrib4 = attrib4;return this;}public String getAttrib5() {return attrib5;}public Parent setAttrib5(String attrib5) {this.attrib5 = attrib5;return this;} }public class Child extends Parent {private String attrib6;private String attrib7;public Child() {}public String getAttrib6() {return attrib6;}public Child setAttrib6(String attrib6) {this.attrib6 = attrib6;return this;}public String getAttrib7() {return attrib7;}public Child setAttrib7(String attrib7) {this.attrib7 = attrib7;return this;} }/*** Now try using method chaining for instances of Child* in the following way, you will get compile time errors.*/ Child c = new Child().setAttrib1("Attribute 1").setAttrib6("Attribute 6");

這樣做的原因是,即使Child從其父級繼承了所有的setter,所有這些setter方法的返回類型也都是Parent類型,而不是Child類型。 因此,第一個設置器將返回類型為Parent的引用,調用setAttrib6會導致編譯錯誤,因為它沒有任何此類方法。

我們可以通過在Parent上引入通用類型參數(shù)并在其上定義遞歸綁定來解決此問題。 它的所有子項從其擴展時都將自己作為類型參數(shù)傳遞,從而確保setter方法將返回其類型的引用:

public abstract class Parent<T extends Parent<T>> {private String attrib1;private String attrib2;private String attrib3;private String attrib4;private String attrib5;public Parent() {}public String getAttrib1() {return attrib1;}@SuppressWarnings("unchecked")public T setAttrib1(String attrib1) {this.attrib1 = attrib1;return (T) this;}public String getAttrib2() {return attrib2;}@SuppressWarnings("unchecked")public T setAttrib2(String attrib2) {this.attrib2 = attrib2;return (T) this;}public String getAttrib3() {return attrib3;}@SuppressWarnings("unchecked")public T setAttrib3(String attrib3) {this.attrib3 = attrib3;return (T) this;}public String getAttrib4() {return attrib4;}@SuppressWarnings("unchecked")public T setAttrib4(String attrib4) {this.attrib4 = attrib4;return (T) this;}public String getAttrib5() {return attrib5;}@SuppressWarnings("unchecked")public T setAttrib5(String attrib5) {this.attrib5 = attrib5;return (T) this;} }public class Child extends Parent<Child> {private String attrib6;private String attrib7;public String getAttrib6() {return attrib6;}public Child setAttrib6(String attrib6) {this.attrib6 = attrib6;return this;}public String getAttrib7() {return attrib7;}public Child setAttrib7(String attrib7) {this.attrib7 = attrib7;return this;} }

請注意,我們已經(jīng)明確地施放此為T類型,因為編譯器不知道這種轉換是否是可能的,即使它是因為牛逼的定義是由父<T>界。 同樣,由于我們將對象引用轉換為T ,因此編譯器將發(fā)出未經(jīng)檢查的警告。 為了抑制這種情況,我們在設置器上方使用了@SuppressWarnings(“ unchecked”) 。

經(jīng)過上述修改,這樣做是完全有效的:

Child c = new Child().setAttrib1("Attribute 1").setAttrib6("Attribute 6");

當以這種方式編寫方法設置器時,我們應注意不要將遞歸邊界用于其他任何目的,例如從父級訪問子級狀態(tài),因為這會使父級暴露于其子類的內部細節(jié),并最終破壞封裝。

通過這篇文章,我完成了泛型的基本介紹。 我在本系列中沒有討論太多的事情,因為我認為它們已經(jīng)超出了介紹的范圍。

直到下一次。

翻譯自: https://www.javacodegeeks.com/2014/07/an-introduction-to-generics-in-java-part-6.html

java 泛型嵌套泛型

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結

以上是生活随笔為你收集整理的java 泛型嵌套泛型_Java泛型简介–第6部分的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 撸啊撸在线视频 | 天海翼一区| 黄色三级免费观看 | 黑人巨大猛交丰满少妇 | 在线观看深夜视频 | 四虎影视www在线播放 | www.97视频| 国产精品xxx视频 | 污视频网站在线观看 | 中国女人性猛交 | 欧美日韩午夜精品 | 西西人体做爰大胆gogo直播 | 人妻精品一区一区三区蜜桃91 | 一级网站在线观看 | 草逼视频免费看 | 日本午夜大片 | 中文字幕精品视频在线观看 | 欧美青青草 | 黄色毛毛片 | 久久久久久久久久久网站 | 成人av日韩 | 成人免费大全 | 免费草逼视频 | 午夜在线免费观看 | 就爱操av | 亚洲人在线播放 | 久久五月天综合 | 日韩精品免费 | 国产伦一区二区 | 国产性猛交╳xxx乱大交一区 | 七月丁香婷婷 | 亚洲一区自拍偷拍 | 亚洲男女视频在线观看 | 日韩在线播放av | 欧美亚日韩 | av中文字幕在线播放 | 亚洲最新av | 久久影视一区二区 | 手机在线观看毛片 | 欧美日韩亚洲视频 | av片免费| 另类男人与善交video | 国产人妻aⅴ色偷 | 成人免费看高清电影在线观看 | 欧美成人精精品一区二区频 | 中文字幕高清视频 | 色在线影院 | 男人在线视频 | 亚洲网站在线免费观看 | 日日爽 | 国产每日更新 | 少妇又紧又色 | 国精产品一二三区精华液 | 激情五月激情 | 91色伦| 亚洲色图小说 | 麻豆网站在线 | 日本欧美在线播放 | 色偷偷综合 | 香蕉视频在线观看www | 成人夜色 | 99热只有这里有精品 | 视频福利在线观看 | 国产精品13p | 短裙公车被强好爽h吃奶视频 | 九九精品视频在线观看 | 中文在线免费视频 | 男人天堂2019 | 狠狠撸在线 | 久久中文字幕在线观看 | 中文字幕亚洲专区 | 久久久久久亚洲 | 九九激情网 | 久久视频免费 | 精品久久伊人 | 玉米地疯狂的吸允她的奶视频 | 日韩第二页 | 日本中文字幕在线观看视频 | 国产香蕉尹人视频在线 | 黄瓜视频色版 | 国产麻豆成人传媒免费观看 | 国产精品久久久久久久久免费软件 | 男男成人高潮片免费网站 | 日本中文视频 | 亚洲激情欧美激情 | 亚洲视频在线观看网址 | 久久一区二区视频 | 毛茸茸亚洲孕妇孕交片 | 精品国产一区在线观看 | 波多野结衣二区 | 91在线免费看片 | 国产草草视频 | 欧美精品激情 | 欧美日韩123 | 国产精品理论片在线观看 | 91少妇丨porny丨 | 久久国内视频 | 午夜爱 | 亚洲逼|