Incompatible types: int[] ne peut pas être convertie Comparable<Object>[]
Je suis nouveau sur les génériques et la coulée de questions. J'essaie de trier n'importe quel type de tableau qui est comparable. L'erreur est que le titre; et le code est comme ci-dessous: et l'erreur est la même pour entier. Quel est le problème et pourquoi?
class Sort{
public static void selectionSort(Comparable<Object>[] input)
{/* selection Sort Alg*/}
public static void main((String[] args){
int[] intArray = {2,3,5,1};
Sort.selectionSort(intArray);
}
}
Vous devez vous connecter pour publier un commentaire.
Vous avez deux questions se posent ici:
int
est une GOUSSE, pas un objet. Boxing et unboxing deint[]
correspondantInteger[]
n'est pas effectuée automatiquement. Vous devez déclarerintArray
comme:Integer
implémenteComparable<Integer>
, pasComparable<Object>
. Les deux spécialisations sont différentes et de types incompatibles. Le droit de déclarerselectionSort
est par l'utilisation de génériques, comme vous le suggérez dans le titre:Comparable<T>
, dans le second, chaque élément est de typeT
, qui est une sous-classe deComparable<T>
. Sans regarderinsertionSort
mise en œuvre, il est difficile de dire où elle se brisa, mais vous avez probablement essayé de lui affecter un élément deinput
(de type statiqueComparable<T>
) à une variable de type statiqueT
, ce qui n'est pas possible sans abattu.Vous avez deux questions dans votre extrait de code
Le poing est l'argument de votre méthode, voyons sur cet exemple
void simple(Comparable<Object> input) {}
Cette méthode simple de s'attendre à une instance de
Comparable<Object>
.Pour créer une instance pour que vous pourrait mettre en œuvre les classe comme:
class MyComparable implements Comparable<Object> {}
Ce que vous devez par la conscience, c'est que genericType ( className ), à assurer votre sécurité. Cela signifie que:
Comparable<String>
pouvez comparer seulement les objets StringComparable<Object>
pouvez comparer uniquement l'Objet d'objetsVous ne pouvez pas vraiment sur la hiérarchie de classe en terme de paramètres génériques.
La classe
Integer
implémenteComparable<Integer>
donc, pour être en mesure d'utiliser que vous pouvez faire ceci:void simple(Comparable<Integer> input) {}
Le, vous serez en mesure de passer tout ce qui implémente
Comparable<Integer>
.Avec des tableaux est la même règle,
void array(Comparable<Integer>[] input) {}
mais ce que vous devez garder à l'esprit est que
int[]
n'est pas le même queInteger[]
JVM utiliser différentes opérations pour ces types.Un
int[]
magasins primitive des valeurs entières.Et
Integer[]
stocke les références auxInteger
classe.Comparable<Integer>[] array = {1,2,3,4};
n'est pas autoriséComparable<Integer>[] array = new Integer[] {1,2,3,4};
est valable déclarationGénériques fonctionnent uniquement avec l'Objet, non pas avec des types primitifs. Heureusement, vous pouvez trouver quelques bonnes classes wrapper dans le package java.lang, à l'instar de l'objet Entier.
Votre code sera le suivant:
Je suggère de modifier le paramètre dans le selectionSort: vous ne voulez pas un
Comparable<Object>
, mais un génériqueT<extends Comparable<? super T>>
; en d'autres mots, vous avez besoin d'un paramètre sur lequel s'étend une classe qui peut comparer T et de leurs super-classesint est un primitif, vous devez utiliser Entier. Vous avez déjà une méthode de tri qui trie Entier:
Peterxwl
plus, puis modifier votre réponse.