这是一些示例代码…我似乎总是会收到ClassCastException …有人指出我在做什么错吗?
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(); } }
为了被添加到TreeSet(以自然顺序),一个类应该与其自身具有可比性:
TreeSet
private class Base<T extends BaseType> implements Comparable<Base> { ... }
而在您的情况下Base与T:
Base
T
private class Base<T extends BaseType> implements Comparable<T> { ... }