2011-08-05 15 views
1

ここにいくつかのサンプルコードがあります...私はいつもClassCastExceptionを取得しているようです...誰かが間違っていることを指摘していますか? (自然順序付けで)TreeSetに追加されるためにはTreeSetにHashMap値を追加するときのエラー

package com.query; 

    import java.util.ArrayList; 
    import java.util.Collection; 
    import java.util.HashMap; 
    import java.util.Map; 
    import java.util.Set; 
    import java.util.TreeSet; 

    import org.junit.Test; 

    import com.google.common.collect.Sets; 


    public class ClassCastExceptionTest { 

     @Test 
     public void test() { 

      A<SomeType> a1 = new A<SomeType>(1); 
      A<SomeType> a2 = new A<SomeType>(2); 
      A<SomeType> a3 = new A<SomeType>(3); 

      Map<String, A<SomeType>> map = new HashMap<String, A<SomeType>>(); 
      map.put("A1", a1); 
      map.put("A2", a2); 
      map.put("A3", a3); 

      Collection<A<SomeType>> coll = map.values(); 

      Set<A<SomeType>> set = Sets.newTreeSet(coll); 

      System.out.println("Done."); 

      //EXCEPTION... 
      //com.query.ClassCastExceptionTest$A cannot be cast to 
      //com.query.ClassCastExceptionTest$BaseType 
     } 

     private class A<T extends BaseType> extends Base<T> { 

      public A(int i) { 
       super(i); 
      } 
     } 

     private class Base<T extends BaseType> implements Comparable<T> { 

      private Integer id; 

      public Base(int id) { 
       this.id = id; 
      } 

      /** 
      * @return the id 
      */ 
      public Integer getId() { 
       return id; 
      } 

      /** 
      * @param id the id to set 
      */ 
      @SuppressWarnings("unused") 
      public void setId(int id) { 
       this.id = id; 
      } 

      @Override 
      public int compareTo(T o) { 
       return getId().compareTo(o.getId()); 
      } 
     } 

     private class SomeType extends BaseType { 

      @Override 
      public Integer getId() { 
       return 0; 
      } 

      @Override 
      public int compareTo(BaseType o) { 
       return this.getId().compareTo(o.getId()); 
      }  
     } 

     private abstract class BaseType implements Comparable<BaseType> { 

      public abstract Integer getId(); 
     } 

    } 

答えて

2

クラスは、それ自身と比較する必要があります:

private class Base<T extends BaseType> implements Comparable<Base> { ... } 

あなたのケースでBaseTと同程度であるのに対し:

private class Base<T extends BaseType> implements Comparable<T> { ... } 
+2

axtavt ...プライベートクラスBase は、それに対応する> {...} 'を実装し、問題を解決しました。 – Ash

0

TreeSetはソートにオブジェクトのcompareToメソッドを使用します。したがって、2番目のAインスタンスをTreeSetに追加すると、A#compareToが他のAインスタンスを引数として呼び出されますが、このメソッドはBaseType(またはBaseTypeのサブクラス)が引数として期待されるため、ClassCastExceptionがスローされます。

関連する問題