真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java中怎么利用extends關(guān)鍵字設(shè)置邊界

本篇文章為大家展示了Java中怎么利用extends關(guān)鍵字設(shè)置邊界,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:國際域名空間、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、鹿邑網(wǎng)站維護(hù)、網(wǎng)站推廣。

類型參數(shù)多邊界的分析

此例中的泛型類,類型參數(shù)帶有多個邊界。講下類的實際意義:Dimension代表物體的方位、HasColor代表物體的顏色、Weight代表物體的重量。

interface HasColor { java.awt.Color getColor(); }class Colored {  T item;  Colored(T item) { this.item = item; }  T getItem() { return item; }  // The bound allows you to call a method:  java.awt.Color color() { return item.getColor(); }}class Dimension { public int x, y, z; }// This won't work -- class must be first, then interfaces:// class ColoredDimension { }// Multiple bounds:class ColoredDimension {  T item;  ColoredDimension(T item) { this.item = item; }  T getItem() { return item; }  java.awt.Color color() { return item.getColor(); }  int getX() { return item.x; }  int getY() { return item.y; }  int getZ() { return item.z; }}interface Weight { int weight(); }// As with inheritance, you can have only one// concrete class but multiple interfaces:class Solid {  T item;  Solid(T item) { this.item = item; }  T getItem() { return item; }  java.awt.Color color() { return item.getColor(); }  int getX() { return item.x; }  int getY() { return item.y; }  int getZ() { return item.z; }  int weight() { return item.weight(); }}class Bounded extends Dimension implements HasColor, Weight {  public java.awt.Color getColor() { return null; }  public int weight() { return 0; }}public class BasicBounds {  public static void main(String[] args) {    Solid solid = new Solid(new Bounded());    solid.color();    solid.getY();    solid.weight();  }} ///:~

class Colored這個泛型類的泛型定義中,要求了類型參數(shù)T的邊界為HasColor,正因如此,在函數(shù)java.awt.Color color() { return item.getColor(); }中便可以通過一個T類型的變量item來調(diào)用屬于HasColor的方法。  class ColoredDimension { },此時定義了邊界同時為HasColor & Dimension,但是由于編譯器要求占位符后的extends后第一個必須是類,之后的必須是接口(這就和正常的類的繼承規(guī)則一樣),所以此句通不過編譯。而class ColoredDimension給出了正確的定義,即第一個必須是類,之后的必須是接口。  class ColoredDimension的類定義中,因為T的邊界是HasColor & Dimension,所以在類定義中,既可以獲取Dimension的屬性,也可以調(diào)用HasColor的方法。  class Solid的類定義中,extends后第一個是類,之后的都是接口,符合剛才講的規(guī)則。同理,也可以從這些邊界中,獲取屬性,調(diào)用方法。  class Bounded extends Dimension implements HasColor, Weight這個類將在生成泛型類對象,用來指定具體類型為Bounded。因為class Solid的類型參數(shù)T的要求是extends Dimension & HasColor & Weight,所以指定具體類型為new Solid,是可以的。因為類定義中構(gòu)造器的聲明為Solid(T item),且具體類型為new Solid中指定的Bounded,所以要求構(gòu)造器的實參為Bounded或者Bounded的子類。

class derivedBounded extends Bounded {}class Bounded1 extends Dimension implements HasColor, Weight {  public java.awt.Color getColor() { return null; }  public int weight() { return 0; }}public class BasicBounds {  public static void main(String[] args) {    //Solid solid = new Solid(new derivedBounded());//給定的具體類型不符合邊界    Solid solid1 = new Solid(new derivedBounded());//可以傳遞具體類型Bounded的子類    //Solid solid2 = new Solid(new Bounded1());//編譯報錯,因為泛型的靜態(tài)類型檢查    solid1.color();    solid1.getY();    solid1.weight();  }} ///:~

根據(jù)上一條,那么new Solid(new Bounded())這里指定的具體類型,由于和泛型類定義的T類型參數(shù)的要求extends Dimension & HasColor & Weight不相符,所以編譯會報錯;給構(gòu)造器傳值時,實參可以是Bounded的子類;一個同樣繼承了相同邊界的類Bounded1 ,不能傳遞給構(gòu)造器,因為類型已經(jīng)被指定為Bounded了。

但是類型參數(shù)有多個邊界時,java內(nèi)部即java字節(jié)碼到底是怎么處理的呢:

public static void main(java.lang.String[]);  Code:    0: new      #2         // class Solid    3: dup    4: new      #3         // class Bounded    7: dup    8: invokespecial #4         // Method Bounded."":()V   11: invokespecial #5         // Method Solid."":(LDimension;)V   14: astore_1

從Method Solid."":(LDimension;)V可以看到,給Solid的構(gòu)造器傳遞參數(shù)時,編譯器認(rèn)為這個形參是個Dimension,這就是編譯器處理多個邊界的方法,永遠(yuǎn)處理為第一個邊界,即類型擦除為第一個邊界。但剩下的兩個邊界怎么辦呢,這里都被處理第一個邊界了,我們再去看一下Solid.class的反編譯代碼就能找到答案:

// Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)import java.awt.Color;class Solid {  T item;  Solid(T item) {    this.item = item;  }  T getItem() {    return this.item;  }  Color color() {    return ((HasColor)this.item).getColor();//類型轉(zhuǎn)換為其他邊界,再調(diào)用方法  }  int getX() {    return this.item.x;  }  int getY() {    return this.item.y;  }  int getZ() {    return this.item.z;  }  int weight() {    return ((Weight)this.item).weight();//類型轉(zhuǎn)換為其他邊界,再調(diào)用方法  }}

當(dāng)調(diào)用的方法不屬于第一個邊界時,就進(jìn)行類型轉(zhuǎn)換處理為其他邊界就行,反正T肯定是符合extends Dimension & HasColor & Weight的。

繼承有邊界要求的泛型類

通過觀察上例可知,Colored、ColoredDimension、Solid這三個類在持有對象的方面有冗余的地方:都有同一個成員變量、同一個構(gòu)造器、同一個get函數(shù)。而類型參數(shù)上,邊界也是依次疊加的。同樣,對于這些邊界所帶來的屬性和方法,也是冗余的。所以下例對其進(jìn)行了修改,通過繼承來消除冗余,注意,下面繼承的泛型類對類型參數(shù)是有邊界要求的:

//HoldItem對邊界T沒有要求class HoldItem {  T item;  HoldItem(T item) { this.item = item; }  T getItem() { return item; }}//Colored2對邊界T有HasColor的要求class Colored2 extends HoldItem {  Colored2(T item) { super(item); }  java.awt.Color color() { return item.getColor(); }}//ColoredDimension2對邊界T有Dimension & HasColor的要求class ColoredDimension2    extends Colored2 {  ColoredDimension2(T item) { super(item); }  int getX() { return item.x; }  int getY() { return item.y; }  int getZ() { return item.z; }}//Solid2對邊界T有Dimension & HasColor & Weight的要求,不過沒有類繼承它了class Solid2    extends ColoredDimension2 {  Solid2(T item) { super(item); }  int weight() { return item.weight(); }}public class InheritBounds {  public static void main(String[] args) {    Solid2 solid2 =        new Solid2(new Bounded());    solid2.color();    solid2.getY();    solid2.weight();  }} ///:~

HoldItem這個泛型類通過類型參數(shù)T把成員變量、構(gòu)造器、get函數(shù)都定義好了,之后的類通過繼承它就可以獲得這些屬性和方法。    Colored2泛型類繼承了HoldItem,獲得了后者的屬性和方法從而減少了冗余。同時,class Colored2屬于“定義泛型類”,extends HoldItem屬于“使用泛型類”,使用泛型類需要指定具體類型,現(xiàn)在確定具體類型的任務(wù)延后到了的確認(rèn)。再從邊界是否符合的情況分析,HoldItem的要求是屬于無邊界,這樣的邊界定義屬于HasColor邊界,從范圍上說是小于等于的,這樣是可以的。由于T添加了HasColor邊界,所以可以調(diào)用item.getColor()方法了。  ColoredDimension2泛型類繼承了Colored2。從邊界是否符合的情況分析,Colored2對T的邊界要求是,而ColoredDimension2定義中的T的邊界是,小于等于,符合要求。換句話說,ColoredDimension2定義中的T的邊界必須比Colored2的邊界要求一致,或者范圍更小。  Solid2泛型類繼承了ColoredDimension2。從邊界是否符合的情況分析,小于等于ColoredDimension2的邊界要求,符合要求。

總結(jié)一下:

當(dāng)一個泛型類繼承另一個泛型類時(前者屬于“定義泛型類”,后者屬于“使用泛型類”),且使用了同一個類型參數(shù)時,定義泛型類的類型參數(shù)邊界定義一定要小于等于使用的那個泛型類的邊界要求。

泛型方法中的邊界定義

泛型方法中對類型參數(shù)的邊界定義,同樣也得符合使用的泛型類的邊界要求。此例中,泛型類同樣繼承別的泛型類,分析同上不贅述。講下類的實際意義:一系列接口代表了超能力、一系列類代表了超級英雄,它們擁有一個超能力的成員變量。

import java.util.*;interface SuperPower {}interface XRayVision extends SuperPower {  void seeThroughWalls();}interface SuperHearing extends SuperPower {  void hearSubtleNoises();}interface SuperSmell extends SuperPower {  void trackBySmell();}class SuperHero {  POWER power;  SuperHero(POWER power) { this.power = power; }  POWER getPower() { return power; }}class SuperSleuth extends SuperHero {  SuperSleuth(POWER power) { super(power); }  void see() { power.seeThroughWalls(); }}class CanineHero extends SuperHero {  CanineHero(POWER power) { super(power); }  void hear() { power.hearSubtleNoises(); }  void smell() { power.trackBySmell(); }}class SuperHearSmell implements SuperHearing, SuperSmell {  public void hearSubtleNoises() {}  public void trackBySmell() {}}class DogBoy extends CanineHero {  DogBoy() { super(new SuperHearSmell()); }}public class EpicBattle {  // Bounds in generic methods:  static  void useSuperHearing(SuperHero hero) {//泛型方法    hero.getPower().hearSubtleNoises();  }  static  void superFind(SuperHero hero) {//泛型方法    hero.getPower().hearSubtleNoises();    hero.getPower().trackBySmell();  }  public static void main(String[] args) {    DogBoy dogBoy = new DogBoy();    useSuperHearing(dogBoy);    superFind(dogBoy);    // You can do this:    List audioBoys;    // But you can't do this:    // List dogBoys;  }} ///:~

主函數(shù)中的useSuperHearing泛型方法中,其對T的邊界定義為。而在形參中使用了泛型類SuperHero,其對邊界的要求是。因為SuperHearing繼承了SuperPower,所以邊界定義符合了對邊界的要求。  主函數(shù)中的useSuperHearing泛型方法中,其對T的邊界定義為。正因如此,在方法中便可以調(diào)用SuperHearing的方法hearSubtleNoises了。

上述內(nèi)容就是Java中怎么利用extends關(guān)鍵字設(shè)置邊界,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


當(dāng)前標(biāo)題:Java中怎么利用extends關(guān)鍵字設(shè)置邊界
分享網(wǎng)址:http://weahome.cn/article/ijhisd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部