fonte d'Objet Comparable en java
Ici, nous avons méthode générique:
public static <T extends Comparable<T>> T[] function(T[] a)
{
Object[] m = new Object[2];
/* some work here */
return (T[]) m;
}
Un ClassCastException
est levée . Quel est le problème avec elle?
Quel est exactement le stacktrace? Aussi, postez le code qui lève l'exception.
Vous êtes à l'aide de Java Génériques en C# Génériques.
Je doute sincèrement qu'il y a une trace de pile ou d'une exception, car le code ne compile pas.
Vous êtes à l'aide de Java Génériques en C# Génériques.
Je doute sincèrement qu'il y a une trace de pile ou d'une exception, car le code ne compile pas.
OriginalL'auteur Majid Azimi | 2011-06-30
Vous devez vous connecter pour publier un commentaire.
Vous avez deux problèmes différents ici.
D'abord, il suffit d'effacer les médicaments génériques et de regarder le code sans les génériques (c'est ce qu'il est effacée au moment de la compilation):
Vous ne pouvez pas lancer un objet dont le réel, la classe d'exécution
Object[]
àComparable[]
. Période.Seconde, même si vous ré-écrit votre code pour créer un
Comparable[]
au lieu deObject[]
il ne serait pas travailler. Il ne sera pas jeter un ClassCastException l'intérieur de cette fonction. Mais il va le jeter dans le code qui appelle cette fonction. Par exemple,
va lancer une ClassCastException, parce que quand vous effacez, vous voyez que le compilateur place d'un plâtre pour la chose qui vient de la méthode générique:
et vous ne pouvez pas lancer un objet dont la classe est
Comparable[]
àString[]
.Lorsque vous demandez: "quelle est la différence" à des gens qui ont dit que
Array.newInstance()
est le moyen de créer un tableau d'une classe connue au moment de l'exécution. La différence est que l'objet retourné parArray.newInstance()
a une "réelle, la durée d'exécution" type deWhatever[]
, où "Quelque chose" est la classe de l'objet de classe est passé. Il n'est pas question que la statique (à la compilation type de la valeur) est de typeObject[]
; c'est la réelle de l'exécution type de questions.Quand vous dites "une Autre question est pourquoi E[] e = (E[]) nouvel Objet[3] œuvres", vous êtes probablement manqué plusieurs points ici. Tout d'abord, qui ne fonctionne que si E est déclarée comme
<E>
ou<E extends Object>
, c'est à dire E de la limite inférieure de l'Objet. Et la deuxième, qui est en fait un mensonge (qui est pratique dans plusieurs endroits, comme la mise en oeuvre d'une collection générique; mais vous devez comprendre pourquoi c'est dangereux); et formellement, vous ne "devraient" pas être en mesure de lancer à partir d'un objet dont le type estObject[]
àE[]
lorsque E n'est pas l'Objet. Il ne "fonctionne" parce que dans le champ d'application de E, E est effacé, et on ne peut donc pas vérifier la fonte. Mais si vous essayez de renvoyer cet objet comme unE[]
pour le monde extérieur, vous obtiendrez une ClassCastException de la même manière.OriginalL'auteur newacct
Un tableau d'Objet n'est pas un tableau de toute sous-classe de l'Objet. Vous êtes confrontés à l'une des limites de génériques en Java: vous ne pouvez pas créer un générique de tableau. Voir ce fil pour une approche qui ne fonctionne pas.
E[] array = (E[]) new Object[10]; //Although is gives warning
C'est la même que dans le code, n'est-ce pas?Si vous compilez qu'avec
-Xlint:unchecked
vous recevrez un avertissement. Et vous ne serez pas heureux avec les résultats au moment de l'exécution, à moins queE
estObject
.OriginalL'auteur Ted Hopp
Object
est pasComparable
. Vous devez définir votre tableau d'un type comparable.Depuis que vous êtes de passage à un tableau, vous pouvez peut-être utiliser le tableau du type:
Et bien sûr, vous aurez à mettre
Comparable
des objets à l'intérieur.Array.newInstance
est la création de nouveaux matrice et le retour de l'Object[]
, puis nous jette àT[]
. C'est ce que j'ai fait dans le code.L'important, c'est de mettre des objets comparables à l'intérieur de la matrice. Le newInstance sauve juste quelques casting.
Tableau.newInstance utilisé ici sera de créer un nouveau tableau de la même classe que l'entrée. En Java il y a une différence entre les tableaux avec les différents types de composants, Object[] et Comparable[] sont deux classes différentes. Il est facile de voir si vous comparez le résultat de getClass sur deux tableaux différents types. En tant que l'Objet n'est pas du même type que votre générique T (et peut-être jamais), vous obtiendrez toujours une ClassCastException.
L'objet est la super classe de toutes les classes. pourquoi nous ne pouvons pas attribuer les tableaux des différentes classes? Une autre question est de savoir pourquoi
E[] e = (E[]) new Object[3]
fonctionne, MaisObject[] o = new Object[3]
et puisE[] e = (E[]) o
ne fonctionne pas? Ils font la même chose? n'est-ce pas?OriginalL'auteur Bozho
Bien, vraiment vous ne pouvez pas convertir un tableau d'objets à un tableau d'éléments de comparaison. Il ne fait aucun sens. Pourquoi le compilateur permettre cela? Qui plus est, par exemple, l'Entier de la classe implémente Comparable, mais vous ne pouvez pas convertir un Comparable tableau d'un tableau d'Entiers.
OriginalL'auteur Luciano
T extends Comparable signifie que le paramètre de méthode (dans ce cas, T) doit s'étendre de comparable. Ainsi, lorsque vous essayez d'effectuer les opérations suivantes en fonte
Vous êtes en train de jeter un Objet[] Comparables[] (ou quoi que ce soit qui s'étend Comparables).
OriginalL'auteur Alfredo Osorio
C'est ce que vous voulez faire:
OriginalL'auteur Reverend Gonzo