为什么TreeSet.contains()不起作用?

oli*_*olz 5 java classcastexception treeset

public class Empty {

    public static void main( String[] args ) {

        TreeSet<Class> classes = new TreeSet<Class>();
        classes.add( String.class );

        String test = new String();

        try{ 
            if( classes.contains(test.getClass()) ){
                System.out.println( "contains" );
            }
        }catch(ClassCastException cce){

            System.out.println( "Expected:  "  + classes );
            System.out.println( "But it was: " + test.getClass() );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么这会抛出ClassCastException

mdm*_*dma 8

TreeSet没有显式比较器的情况下进行实例化时,它需要实现插入的元素Comparable,但Class不实现此接口.

要修复,请创建一个比较器Class:

Comparator<Class> classComp = new Comparator<Class>()
{
    @Override
    public int compare(Class o1, Class o2)
    {
        return o1.getName().compareTo(o2.getName());
    }
};
TreeSet<Class> classes = new TreeSet<Class>(classComp);
Run Code Online (Sandbox Code Playgroud)

  • @candrian - 感谢投票.但你怎么会忽视案件呢?类名在java中不区分大小写,名称(在源中给出)是存储在类文件中的内容. (3认同)