簡體   English   中英

名稱沖突:類型為test2的方法add(Object)具有與HashSet類型的add(E)相同的擦除 <E> 但不會覆蓋它

[英]Name clash: The method add(Object) of type test2 has the same erasure as add(E) of type HashSet<E> but does not override it

import java.util。*;

  class A extends HashSet<Integer> {
       public boolean add(Object obj){  //compiler error
        return true;
       }
    }
    or
   class Abc <T> {
    public void add(T t){}  //compiler error
    public void add(Object i){} //compiler error (can't overload?)
    }

錯誤:名稱沖突:類型為test2的方法add(Object)與類型為HashSet的add(E)具有相同的擦除但不覆蓋它

我不知道上面背后的概念是什么錯誤可以任何人建議我可以在哪里研究這個概念?

這里的概念稱為類型擦除 HashSet定義了一個方法add(T) ,並定義了一個方法add(Object) 人們可能會認為這是可以的; 您的方法只是重載add 然而, T的擦除是Object ,因此兩者具有相同的擦除簽名。

現在,如果你的方法從HashSet正確地覆蓋了方法,那HashSet 但要這樣做,你應該使用add(Integer)而不是add(Object) 您沒有正確覆蓋父方法,因此它被報告為沖突,因為類不能提供具有相同簽名的兩個方法。

您的Abc示例遵循相同的推理。 您聲明的兩個方法具有相同的擦除簽名,因此它們會發生沖突。

進一步閱讀

Angelika Langer Generics FAQ

interface CollectionConverter<U> {
    <T> List<T> toList(Collection<T> c);

    void fooMethod(Class<?> c);

    <E>Comparable<E> method3(E e);

    Comparable<U> method4(U u);
}

class Overrider implements CollectionConverter<Integer> {
    @Override
    public List toList(Collection c) {
        return null;
    }

    @Override
    public void fooMethod(Class c) {

    }

    @Override
    public  Comparable method3(Object o) {
        return null;
    }

    @Override
    public Comparable method4(Integer u) {
        return null;
    }
}

這段代碼效果很好。 在JLS中:子簽名的概念旨在表達兩個方法之間的關系,這兩個方法的簽名不相同,但其中一個方法可能會覆蓋另一個方法。 具體來說,它允許其簽名不使用泛型類型的方法覆蓋該方法的任何泛化版本。 這很重要,因此庫設計者可以獨立於定義庫的子類或子接口的客戶端自由地生成方法。

您是否嘗試使用Integer而不是Object obj ie

public boolean add(Integer i) { //compiler error return true; }

問題是,當您擴展Hashset時,您將擴展Integer Hashset而不是泛型形式。 因此,在子類中,add方法必須符合超類方法的簽名

public boolean add(Integer i){}

如果您想從完全通用的Hashset實現擴展,請嘗試使用

public class MyHashset extends Hashset<?> {

}

然后你的add方法應該與Object一起使用。

暫無
暫無

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

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