Вопрос

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() );
        }
    }
}

Почему это бросает ClassCastException?

Это было полезно?

Решение

При создании 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);

Другие советы

TreeSet это упорядоченный набор, поэтому любой элемент, который вы должны реализовать Comparable (если вы не укажете на заказ Comparator). Class не.

Если вам не нужен заказ, вы всегда можете использовать неупорядоченный набор, такой как Хешету. Анкет В противном случае вам нужно будет придумать свое собственное упорядочение.

От Javadoc (акцент на мой):

Внедрение навигациотов на основе TREEWAP. Элементы упорядочены с использованием их естественного упорядочения или компаратором, предоставленным во время создания установки, в зависимости от того, какой конструктор используется.

Эта реализация обеспечивает гарантированную временную стоимость журнала (n) для основных операций (добавить, удалить и содержит).

Обратите внимание, что Заказ, поддерживаемый набором (должен ли предоставляться явный компаратор) должен соответствовать равным Если это правильно внедрить установленный интерфейс. (См. Сравнимый или компаратор для точного определения в соответствии с равными.) Это так, поскольку набор интерфейс определен в терминах операции равных, но экземпляр TreateT выполняет все сравнения элементов, используя метод SomeSto (или сравнения), так что два Элементы, которые считаются равными этим способом, с точки зрения набора, равных. Поведение набора хорошо определено, даже если его упорядочение не соответствует равным; Это просто не подчиняется общему договору установленного интерфейса.

Смотрите также: Компаратор

Блокнот, почему этот бросает классное выражение?

Это было вызвано реализацией TREEWAP, Treet, который является ключевым набором TREEWAP, основана на этом.

java.lang.class не реализует интерфейс java.langomableable, поэтому он будет выбросить исключение классы.

Фактическая ошибка java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.Comparable . Анкет Вот это - TreeSet накладывает упорядочение на элементы. Если вы используете хеш-сайт, все в порядке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top