[英]Name clash of getPartition of type Partitioner has the same erasure of type main class in MapReduce, Hadoop
[英]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.