程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 泛型方法與橋方法,泛型

泛型方法與橋方法,泛型

編輯:JAVA綜合教程

泛型方法與橋方法,泛型


  Java泛型中有存在一種方式叫做類型擦除,也就是說泛型在編譯期間進行類型檢驗上做到有效安全,但是在運行當中,會將該泛型類型用頂層父類(若無繼承關系則用Object)代替,然後再進行強轉換成目標類型,這種類型擦除也存在在泛型方法中,但是方法的擦除帶來了兩個復雜的問題。

  

public class ParentString<String> {
    String src;
    public void setSrc(String src){
        this.src=src;
    }
}
public class ChildString extends ParentString<String> {
    String s="childString";
    public void setSrc(String src){
        src=s;
    }
}

  在類型擦除之後,代碼演變成如下的樣子

public class ChildString extends ParentString {
    String s="childString";
    public void setSrc(String src){
        src=s;
    }
}

  然而令人奇怪的是,由於類型擦除導致的還有另外一個從ParentString繼承來的setSrc方法,即 setSrc(Object String)。

  由於參數的類型不同,這是兩個不同的方法,但是這種情況不應該出現的。考慮一下下面的語句序列

  

     ChildString childString=new ChildString();
        ParentString<String> parentString=childString;
        parentString.setSrc("aaa");

  這裡在一般的情況下是通過多態的關系,parentString引用了子類ChildString的方法,問題在於類型擦除與多態發生了沖突。要解決這個問題,就需要在ChildString中生成一個橋方法(bridge method)

 public void setSrc(Object src){
        setSrc((String)src);
    }

  值得注意的還有一點,橋方法不僅用於泛型類型,目的是用來被合成保持多態。在一個方法覆蓋另一個方法時可以指定一個更嚴格的返回類型。

  還有另外一個知識點作為補充

  

 

  轉載請說明原文出處:http://www.cnblogs.com/xxzhuang/p/5968331.html  多謝合作。

  

    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved