簡體   English   中英

在Java中鍵入擦除意外行為

[英]Type erasure unexpected behavior in Java

根據Java關於類型擦除有界類型參數的文檔,我理解在下面的代碼示例中,兩個版本的doStuff()將具有相同的擦除,因此將無法編譯。 我的目標是重載doStuff()以接收ClassOneClassTwo

import java.util.List;

class Example {
  class ClassOne {
  }

  class ClassTwo {
  }

  public void doStuff(List<ClassOne> collection) {
  }

  public void doStuff(List<ClassTwo> collection) {
  }
}

類型擦除的機制包括以下步驟:

·如果類型參數是無界的,則泛型或對象替換泛型類型中的所有類型參數。 因此,生成的字節碼僅包含普通的類,接口和方法。

因此,我應該能夠應用一個綁定,然后它將編譯,因為現在類型擦除版本的doStuff重載了兩個不同的簽名(聲明的上限)。 例:

class Example {
  class ClassOne {
  }

  class ClassTwo {
  }

  public <U extends ClassOne> void doStuff(List<U> collection) {
  }

  public <U extends ClassTwo> void doStuff(List<U> collection) {
  }
}

第二個例子實際上沒有編譯並給出以下錯誤:

錯誤:(15,36)java:name clash:doStuff(java.util.List)和doStuff(java.util.List)具有相同的擦除

任何人都可以向我解釋這個嗎?

問題是List<U>將在您的兩種方法中簡化為List (擦除后不能List<ClassOne>List<Object> 。)

您引用的段落意味着可以擁有以下聲明:

class Example {
    class ClassOne {
    }

    class ClassTwo {
    }

    public <U extends ClassOne> void doStuff(U foo) {
    }

    public <U extends ClassTwo> void doStuff(U foo) {
    }
}

這里的泛型參數將分別由ClassOneClassTwo替換,這樣可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM