Почему Set.contains ()не использует o.equals ()?

У меня есть TreeSet, содержащий обертки, которые хранят объект Fooв определенном position, определенном так:

class Wrapper implements Comparable {
  private final Foo foo;
  private final Double position;

 ...

  @Override boolean equals(Object o) {

   ... 

    if(o instanceof Wrapper)
        return o.getFoo().equals(this.foo);

    if(o instanceof Foo)
        return o.equals(this.foo);
  }

  @Override public int compareTo(MarkerWithPosition o) {
      return position.compareTo(o.getPosition());
  }
}

NavigableSet fooWrappers = new TreeSet();

потому что я хочу, чтобы мой TreeSetбыл упорядочен по position, но доступен для поиска по foo. Но когда я выполняю эти операции:

Foo foo = new Foo(bar);
Wrapper fooWrapper = new Wrapper(foo, 1.0);
fooWrappers.add(fooWrapper);

fooWrapper.equals(new Wrapper(new Foo(bar), 1.0));
fooWrapper.equals(new Foo(bar));
fooWrappers.contains(fooWrapper);
fooWrappers.contains(new Wrapper(foo, 1.0));
fooWrappers.contains(new Wrapper(new Foo(bar), 1.0));
fooWrappers.contains(new Wrapper(foo, 2.0));
fooWrappers.contains(foo);

Я получаю:

true
true
true
true
true
false
Exception in thread "main" java.lang.ClassCastException: org.gridqtl.Marker cannot be cast to java.lang.Comparable
    at java.util.TreeMap.getEntry(TreeMap.java:325)
    at java.util.TreeMap.containsKey(TreeMap.java:209)
    at java.util.TreeSet.contains(TreeSet.java:217)

когда я ожидаю, что все они вернут true, похоже, TreeSet.containsне использует мой метод equals, как предлагает API . Есть ли другой метод, который мне нужно перезаписать?

5
задан bountiful 30 July 2012 в 13:14
поделиться