2010-01-21 5 views
3

Je rencontre des problèmes pour essayer de transmettre un objet Integer d'une classe de pilote en tant qu'argument pour la fonction d'une classe Generated SortedArray que j'ai créée. À partir de ma classe de pilote, je convertis l'entrée int de l'utilisateur en un objet Integer à convertir sur Comparable de ma classe SortedArray.Java: Integer obj ne peut pas convertir en objet comparable

Je continue de recevoir l'erreur: "Exception dans le thread" principal "java.lang.ClassCastException: java.lang.Integer ne peut pas être converti en comparable". J'ai jeté un coup d'œil à certains codes source de mes camarades de classe pour trouver peu de différence dans la définition des arguments/paramètres, mais ils ont tout de même un bon fonctionnement de leur code. J'ai cherché des heures à essayer de trouver quelle erreur j'ai faite et je n'arrive toujours pas à trouver pourquoi mon objet Integer ne peut pas être converti en Comparable.

est ici un peu de ma classe 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; 
    } 

Voici le code de ma classe de pilote qui passe entier objet insertObj comme argument pour la fonction d'insertion de 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; 
+2

Vous pouvez essayer d'ajouter votre trace de pile d'exception complète ici. –

+1

Dans le code que vous avez posté, il n'y a rien casted. Pourriez-vous poster un SSCCE qui montre le comportement que vous décrivez? http://sscce.org –

Répondre

5

Le problème est que Integer étend java.lang.Comparable, votre Comparable n'est pas un java.lang.Comparable. Regardez le message d'erreur, votre Comparable provient du package par défaut plutôt que java.lang:

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

C'est, vous ne pouvez pas lancer java.lang.Integer à votre propre classe

0

Je n'ai pas mis trop d'efforts à ce sujet, mais ne serait-il être plus facile d'utiliser une implémentation SortedSet (ou son interface enfant NavigableSet) comme TreeSet plutôt que d'écrire votre propre classe? Autrement dit, à moins que vous vouliez dupliquer des éléments ...

+1

"J'ai regardé quelques codes sources de mes camarades de classe" Je pense que cette classe est son devoir. –

+0

Bon point. J'ai repermé la question avec l'étiquette de devoir. – Powerlord

4

Comme mentionné par axtavt, le problème est que vous avez votre propre classe comparable. Plus précisément, ce que cela signifie est que:

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

Cela signifie que quelque part dans votre code que vous avez quelque chose comme:

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. 

Vous devez changer cela pour:

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

Même mieux, vous devez renommer votre classe Comparator en quelque chose qui ne soit pas en conflit avec les classes standard en Java. En général, même si Java a un espace de noms, vous devriez essayer d'éviter que vos classes aient le même nom que les classes système pour éviter ce genre de confusion.

Questions connexes