Java: целочисленный объект не может быть приведен к Comparable - PullRequest
3 голосов
/ 21 января 2010

У меня возникают проблемы при попытке передать объект Integer из класса драйвера в качестве аргумента для функции созданного мной универсального класса SortedArray. Из моего класса драйвера я преобразую входные данные пользователя int в объект Integer, который будет приведен к Comparable моего класса SortedArray.

Я продолжаю получать сообщение об ошибке: «Исключение в потоке» main «java.lang.ClassCastException: java.lang.Integer не может быть приведен к Comparable». Я взглянул на некоторые исходные коды моих одноклассников только для того, чтобы найти небольшую разницу в настройке аргументов / параметров, но их код работает нормально. Я часами пытался выяснить, какую ошибку я совершил, и до сих пор не могу понять, почему мой объект Integer не может быть приведен к Comparable.

Вот немного из моего класса 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 Object 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;

Ответы [ 3 ]

6 голосов
/ 21 января 2010

Проблема в том, что 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 в своем собственном классе

5 голосов
/ 21 января 2010

Как уже упоминалось axtavt , проблема в том, что у вас есть собственный класс Comparable. Более конкретно, это означает, что:

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];

Еще лучше, вы должны переименовать ваш класс Comparator во что-то, что не вступает в противоречие со стандартными классами в Java. В целом, даже несмотря на то, что в Java есть пространство имен, вам следует избегать того, чтобы у ваших классов было то же имя, что и у системных классов, чтобы избежать именно такой путаницы.

0 голосов
/ 21 января 2010

Я не приложил слишком много усилий, но было бы проще использовать реализацию SortedSet (или ее дочерний интерфейс NavigableSet) как TreeSet, а не написать свой собственный класс? То есть, если вы не хотели дублировать элементы ...

...