سؤال

أواجه مشاكل في محاولة تمرير كائن عدد صحيح من فئة برنامج التشغيل كوسيطة لوظيفة فئة عامة SortedArray التي قمت بإنشائها. من فئة برنامج التشغيل الخاصة بي ، أقوم بتحويل إدخال int الخاص بالمستخدم إلى كائن عدد صحيح ليتم إلقاؤه على مقارنة من فئة sortedarray الخاصة بي.

ما زلت أتلقى الخطأ: "استثناء في الموضوع" الرئيسي "java.lang.classcastexception: java.lang.integer لا يمكن إلقاؤه للمقارنة". لقد ألقيت نظرة على بعض رموز مصدر زملائي فقط لإيجاد اختلاف ضئيل في تعيين الوسائط/المعلمات ، لكن لديهم رمزهم يعمل بشكل جيد. لقد كنت أبحث عن ساعات في محاولة للعثور على الخطأ الذي ارتكبته وما زلت لا أجد لماذا لا يمكن للمقارنة كائن INTEGER الخاص بي.

هذا قليلا من صف sortedarray الخاص بي

public class SortedArray implements Comparable{
    public int size;
public int increment;
public int top;
    Comparable[] a = new Comparable [size];

public SortedArray(int initialSize, int incrementAmount)
{
        top = -1;
        size = initialSize;
        increment = incrementAmount;

}
public int appropriatePosition(Comparable value)
{
        int hold = 0;
        if(top == -1)
        {
            return 0;
        }
        else
        {    
            for(int i = 0; i <= top; i++)
            {
                if(a[i].compareTo(value) > 0)
                {
                    hold = i;
                    break;
                }
            }
        }
        return hold;
}

public void insert(Comparable value) //The function that my driver class needs to access
{
        //Shifting numbers to the top
        if(full() == true)
        {
            Comparable[] tempArray = new Comparable[top + increment];
            for(int i= 0; i< size; i++)
            {
                tempArray[i]= a[i];
                a  = tempArray;
            }
            size = top + increment;
        }
        if(a[appropriatePosition(value) + 1] != null)
        {
            for(int i = top; i < appropriatePosition(value); i--)
            {
                a[i + 1] = a[i];
            }
        }
        a[appropriatePosition(value) + 1]= value;
    }

فيما يلي رمز فئة برنامج التشغيل التي تمرر كائن Integer InsertObj كوسيطة لوظيفة إدراج SortedArray.

public class IntDriver  {
 public static void main(String[] args)
 {
     Scanner keyboard = new Scanner(System.in);
     //Creating variables
     int data;
     boolean check = false;
     int choice;
     int size = 5;
     int increment = 3;
     SortedArray b = new SortedArray(size, increment);
     //Creating Menu
     while(check == false)
     {
     System.out.println("Please choose through options 1-6.");
     System.out.println("1. Insert\n2. Delete\n3. Clear\n4. Smallest\n5. Largest\n6. Exit");
     choice = keyboard.nextInt();
     switch(choice)
         {
         case 1:
             System.out.println("Type the int data to store in array location.");
             data = keyboard.nextInt();
             Integer insertObj = new Integer(data);
             b.insert(insertObj);// Here's where I lay "insertObj" as an argument for the SortedArray function.
             System.out.println("The value " + data + " is inserted");
            break;
هل كانت مفيدة؟

المحلول

المشكلة هي Integer يمتد java.lang.Comparable, ، ثم الخاص بك Comparable ليس java.lang.Comparable. انظر إلى رسالة الخطأ ، Comparable يأتي من الحزمة الافتراضية بدلاً من java.lang:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to Comparable

هذا هو ، لا يمكنك الإلقاء java.lang.Integer إلى صفك الخاص

نصائح أخرى

كما ذكر Axtavt, المشكلة هي أن لديك فصلك الخاص قابلاً للمقارنة. وبشكل أكثر تحديدًا ، ما يعنيه ذلك هو:

Integer.valueOf(1) instanceof java.util.Comparable == true
Integer.valueOf(1) instanceof Comparable == false

هذا يعني أنه في مكان ما في الكود الخاص بك لديك شيء مثل:

Object[] a = new Object[] {Integer.valueOf(1);};
Comparable x = (Comparable) a[0];
// or something equivalent, this is likely being passed through layers
// and not being done next to each other like this.

تحتاج إلى تغيير ذلك إلى:

Object[] a = new Object[] {Integer.valueOf(1);};
java.util.Comparable x = (java.util.Comparable) a[0];

والأفضل من ذلك ، يجب عليك إعادة تسمية فئة المقارنة إلى شيء لا يصطدم بالفئات القياسية في Java. بشكل عام ، على الرغم من أن Java لديها أسماء ، يجب أن تحاول تجنب فصولك التي لها نفس اسم فئات النظام لتجنب هذا النوع من الارتباك بالضبط.

لم أقم ببذل الكثير من الجهد في هذا ، لكن ألن يكون من الأسهل استخدام ملف SortedSet التنفيذ (أو واجهة طفلها NavigableSet) مثل TreeSet بدلا من كتابة الفصل الخاص بك؟ هذا هو ، إلا إذا أردت عناصر مكررة ...

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