欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解java 中泛型中的類型擦除和橋方法

 更新時(shí)間:2017年06月22日 11:10:18   投稿:lqh  
這篇文章主要介紹了詳解java 中泛型中的類型擦除和橋方法的相關(guān)資料,需要的朋友可以參考下

在Java中,泛型的引入是為了在編譯時(shí)提供強(qiáng)類型檢查和支持泛型編程。為了實(shí)現(xiàn)泛型,Java編譯器應(yīng)用類型擦除實(shí)現(xiàn):

       1、  用類型參數(shù)(type parameters)的限定(如果沒有就用Object)替換泛型類型中的所有類型參數(shù)。

       2、  需要保持類型安全的時(shí)候加入類型轉(zhuǎn)換

       3、  在extened 泛型類型中生成橋方法來保證多態(tài)性

   類型擦除確保不會(huì)為已參數(shù)化了的類型(paramterized types)產(chǎn)生新類,這樣泛型能保證沒有運(yùn)行時(shí)的負(fù)載。

泛型類型擦除

      在類型擦除過程中,java編譯器擦除所有類型參數(shù),用它的限定或者Object(沒限定時(shí))替換。

     考慮下面的泛型類:

public class Node<T> { 
 
 private T data; 
 private Node<T> next; 
 
 public Node(T data, Node<T> next) } 
  this.data = data; 
  this.next = next; 
 } 
 
 public T getData() { return data; } 
 // ... 
} 

因?yàn)轭愋蛥?shù)T是非限定的,Java編譯器使用Object替換它:

public class Node { 
 
 private Object data; 
 private Node next; 
 
 public Node(Object data, Node next) { 
  this.data = data; 
  this.next = next; 
 } 
 
 public Object getData() { return data; } 
 // ... 
} 

下面的例子,泛型Node類使用了限定類型參數(shù):

public class Node<T extends Comparable<T>> { 
 
 private T data; 
 private Node<T> next; 
 
 public Node(T data, Node<T> next) { 
  this.data = data; 
  this.next = next; 
 } 
 
 public T getData() { return data; } 
 // ... 

編譯器會(huì)使用第一個(gè)限定類,Comparable替換限定參數(shù)類型T:

public class Node { 
 
 private Comparable data; 
 private Node next; 
 
 public Node(Comparable data, Node next) { 
  this.data = data; 
  this.next = next; 
 } 
 
 public Comparable getData() { return data; } 
 // ... 
} 

同樣,泛型方法也可以擦除。規(guī)則類似,不細(xì)說。

類型擦除的影響和橋方法

有時(shí)候類型擦除會(huì)引起無法預(yù)知的情況。比如:

給定以下兩個(gè)類:

public class Node<T> { 
 
 public T data; 
 
 public Node(T data) { this.data = data; } 
 
 public void setData(T data) { 
  System.out.println("Node.setData"); 
  this.data = data; 
 } 
} 
 
public class MyNode extends Node<Integer> { 
 public MyNode(Integer data) { super(data); } 
 
 public void setData(Integer data) { 
  System.out.println("MyNode.setData"); 
  super.setData(data); 
 } 
} 

考慮以下代碼:

MyNode mn = new MyNode(5); 
Node n = mn;   // 原生類型 – 編譯器會(huì)給出未檢查警告 
n.setData("Hello");  
Integer x = mn.data; // 會(huì)引發(fā)拋出ClassCastException 

 類型擦除后,代碼變成:

MyNode mn = new MyNode(5); 
Node n = (MyNode)mn;   //原生類型 – 編譯器會(huì)給出未檢查警告 
n.setData("Hello"); 
Integer x = (String)mn.data; //會(huì)引發(fā)拋出ClassCastException 
public class Node { 
 
 public Object data; 
 
 public Node(Object data) { this.data = data; } 
 
 public void setData(Object data) { 
  System.out.println("Node.setData"); 
  this.data = data; 
 } 
} 
 
public class MyNode extends Node { 
 
 public MyNode(Integer data) { super(data); } 
 
 public void setData(Integer data) { 
  System.out.println("MyNode.setData"); 
  super.setData(data); 
 } 
} 

類型擦除后,方法的簽名已經(jīng)不匹配。Node 方法變成setData(Object),MyNode方法變成setData(Integer)。MyNode setData方法已經(jīng)不是覆蓋Node setData方法。

為了解決這個(gè)問題,維持泛型類型的多態(tài)性,java編譯器會(huì)生成一個(gè)橋方法:

class MyNode extends Node { 
 
 // 編譯器生成的橋方法 
 // 
 public void setData(Object data) { 
  setData((Integer) data); 
 } 
 
 public void setData(Integer data) { 
  System.out.println("MyNode.setData"); 
  super.setData(data); 
 } 
 
 // ... 

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • SpringBoot3使用?自定義注解+Jackson實(shí)現(xiàn)接口數(shù)據(jù)脫敏的步驟

    SpringBoot3使用?自定義注解+Jackson實(shí)現(xiàn)接口數(shù)據(jù)脫敏的步驟

    本文介紹了一種以優(yōu)雅的方式實(shí)現(xiàn)對(duì)接口返回的敏感數(shù)據(jù),如手機(jī)號(hào)、郵箱、身份證等信息的脫敏處理,這種方法也是企業(yè)常用方法,話不多說我們一起來看一下吧
    2024-03-03
  • Presto支持Elasticsearch數(shù)據(jù)源配置詳解

    Presto支持Elasticsearch數(shù)據(jù)源配置詳解

    這篇文章主要為大家介紹了Presto支持Elasticsearch數(shù)據(jù)源配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • java 之JNA中的Memory和Pointer的使用方法

    java 之JNA中的Memory和Pointer的使用方法

    這篇文章主要介紹了java 之JNA中的Memory和Pointer的使用方法,文章基于Java的相關(guān)自來哦展開對(duì)Pointer和Memory的使用介紹,需要的小伙伴可以參考一下
    2022-04-04
  • java+Okhttp3調(diào)用接口的實(shí)例

    java+Okhttp3調(diào)用接口的實(shí)例

    這篇文章主要介紹了java+Okhttp3調(diào)用接口的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java的運(yùn)算符和程序邏輯控制你了解嗎

    Java的運(yùn)算符和程序邏輯控制你了解嗎

    這篇文章主要為大家詳細(xì)介紹了Java的運(yùn)算符和程序邏輯控制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • java中HashMap的七種遍歷方式小結(jié)

    java中HashMap的七種遍歷方式小結(jié)

    本文主要介紹了java中HashMap的七種遍歷方式小結(jié),包括迭代器,For Each,Lambda,Streams API等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • springboot結(jié)合mybatis-plus基于session模擬短信注冊(cè)功能

    springboot結(jié)合mybatis-plus基于session模擬短信注冊(cè)功能

    本文主要介紹了springboot結(jié)合mybatis-plus基于session模擬短信注冊(cè)功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • Intellij IDEA如何自定義注釋模板的實(shí)現(xiàn)方法

    Intellij IDEA如何自定義注釋模板的實(shí)現(xiàn)方法

    這篇文章主要介紹了Intellij IDEA如何自定義注釋模板的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • JAVA中Collections.sort()方法使用詳解

    JAVA中Collections.sort()方法使用詳解

    這篇文章主要給大家介紹了關(guān)于JAVA中Collections.sort()方法使用的相關(guān)資料,Java中Collections.sort()方法是用來對(duì)List類型進(jìn)行排序的,文中通過代碼將使用的方法介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Spring JPA聯(lián)表查詢之OneToOne源碼詳解

    Spring JPA聯(lián)表查詢之OneToOne源碼詳解

    這篇文章主要為大家介紹了Spring JPA聯(lián)表查詢之OneToOne源碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04

最新評(píng)論