好程式設計師Java培訓之泛型繼承原理與用法詳解

好程式設計師發表於2020-10-09

   今天 好程式設計師Java 培訓給大家分享一篇關於 Java 泛型繼承原理與用法詳解,結合例項形式分析了 Java 泛型繼承的相關原理與實現技巧,下面我們一起來看一下吧。

一、

當建立了帶泛型宣告的介面、父類之後,可以為該介面建立實現類,或從該父類來派生子類,但值得指出的是,當使用這些介面、父類時不能再包含型別形參。

如果使用泛型類時沒有傳入實際的型別引數, Java 編譯器可能發出警告:使用了未經檢查或不安全的操作——這就是泛型檢查的警告。

二、實戰——傳入實際的型別引數

public class A1 extends Apple<String> {

  // 正確重寫了父類的方法,返回值

  // 與父類 Apple<String> 的返回值完全相同

  public String getInfo() {

    return " 子類 " + super.getInfo();

  }

  /*

  // 下面方法是錯誤的,重寫父類方法時返回值型別不一致

  public Object getInfo()

  {

   return " 子類 ";

  }

  */

}

三、實戰——沒傳入實際的型別引數

public class A2 extends Apple {

  // 重寫父類的方法

  public String getInfo() {

    // super.getInfo() 方法返回值是 Object 型別,

    // 所以加 toString() 才返回 String 型別

    return super.getInfo().toString();

  }

}

四、並不存在泛型類

1 點睛

雖然可以把ArrayList<String> 類當成 ArrayList 的子類,事實上 ArrayList<String> 類也確實是一種特殊的 ArrayList 類,這個 ArrayList<String> 物件只能新增 String 物件作為集合元素。但實際上,系統並沒有為 ArrayList<String> 生成新的 class 檔案,而且也不會把 ArrayList<String> 當成新類來處理。

實際上,泛型對其所有可能的型別引數,都具有同樣的行為,從而可以把相同的類被當成許多不同的類來處理。與此完全一致的是,類的靜態變數和方法也在所有的例項間共享,所以在靜態方法、靜態初始化、或者靜態變數的宣告和初始化中不允許使用型別形參。

系統中並不會真正生成泛型類,所以instanceof 運算子後不能使用泛型類。

2 實戰

public class R<T>

{

  // 下面程式碼錯誤,不能在靜態變數宣告中使用型別形參

// static T info;

  T age;

  public void foo(T msg){}

  // 下面程式碼錯誤,不能在靜態方法宣告中使用型別形參

// public static void bar(T msg){}

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2725849/,如需轉載,請註明出處,否則將追究法律責任。

相關文章