我正在寫一個作爲excercise在java中的skiplist類。我寫了一個名爲SkipListInternal<E>
的課程,其中包含實際的跳過列表。我還製作了一個名爲SkipListSet<E>
的包裝類,它實現了SortedSet<E>
接口幷包含SkipListInternal<E>
的一個實例。寫作包含()通用集合
除其他事項外,SkipListInternal<E>
包含方法E find(E e)
如果其存在,其返回元素等於e
,否則返回null。
當寫boolean contains(Object o)
方法我注意到,它的參數是一個對象,而不是一個E.我打算做這樣的事情,但是是不可能的,因爲類型擦除(通過SortedSet<E>
從Collection<E>
繼承):
public class SkipListSet<E> implements SortedSet<E>{
private SkipListInternal<E> skiplist;
...
public boolean contains(Object o){
if (!(o instanceof E)) return false;
return skiplist.find((E) o) != null;
}
...
}
既然不能這樣做,我該怎麼做呢?
它真的是有意的行爲嗎? equals的規則要求實現是對稱的,但是你的`FakeString`打破了這個規則。所有內置的`SortedSet`實現(`TreeSet`,來自java.util.concurrent的跳過列表實現)使用Comparator/Comparable並且根本不調用`equals`。 – Dirk 2011-02-14 12:36:15
@Dirk,同樣的問題適用於Comparator/Comparable。 – 2011-02-14 12:41:51
@Dirk:`TreeSet`文檔甚至聲稱它「[...]不服從`Set`接口的一般合同。」 – 2011-02-14 12:44:19