سؤال

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 لا.

إذا لم تكن بحاجة إلى الطلب ، فيمكنك دائمًا استخدام مجموعة غير مرتبة مثل Hashset. خلاف ذلك ، ستحتاج إلى التوصل إلى طلب خاص بك.

من جافادوك (منجم التركيز):

تطبيق Navigableset استنادًا إلى treemap. يتم طلب العناصر باستخدام طلبها الطبيعي ، أو عن طريق المقارنة المقدمة في وقت إنشاء المجموعة, ، اعتمادا على أي مُنشئ يستخدم.

يوفر هذا التنفيذ تكلفة زمنية مضمونة (N) للعمليات الأساسية (إضافة وإزالة وتحتوي على).

لاحظ أن يجب أن يكون الترتيب الذي يتم الاحتفاظ به بواسطة مجموعة (سواء تم توفير مقارن صريح أم لا) متسقًا مع المساواة إذا كان من الممكن تنفيذ واجهة SET بشكل صحيح. (انظر مقارن أو مقارن للحصول على تعريف دقيق للمتسق مع متساو العناصر التي تعتبر متساوية بهذه الطريقة هي ، من وجهة نظر المجموعة ، متساوية. يتم تعريف سلوك المجموعة بشكل جيد حتى لو كان ترتيبها غير متساوٍ مع المساواة ؛ يفشل فقط في إطاعة العقد العام للواجهة المحددة.

أنظر أيضا: المقارنة

blockquote لماذا هذا يرمي classcastexception؟

لقد كان سبب تنفيذ Treemap ، وهي مجموعة أساسية من Treemap تستند إليها.

Java.lang.class لا تنفذ واجهة java.lang.comparable ، وبالتالي سوف يلقي استثناء من classcastexception.

الخطأ الفعلي هو java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.Comparable . ها هو - Treeset تفرض طلبًا على العناصر. إذا كنت تستخدم hashset ، كل شيء على ما يرام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top