-1
votes

Java Explicit Casting sur list.get (0) (types incompatibles: java.lang.Object ne peut pas être converti en java.lang.string)

Le code suivant est mentionné dans les didacticiels Java :-( HTTPS : //docs.oracle.com/javase/tatutorial/java/generics/whie.html ) xxx

Le casting dans la dernière ligne suggère que list.get (0) ne retourne pas une chaîne. Maintenant, puisque la liste n'a pas été déclarée avec un type de données, elle peut prendre n'importe quel objet. J'ai donc supposé que list.get (0) renvoie un type d'objet.

mais quand je vérifie list.get.get (0) instanceOf string -> Il revient vrai.

Pourquoi est alors le casting explicite requis. S'il vous plaît, expliquez.


1 commentaires

Ce qui s'est passé lorsque vous ajouterez list.add (1000L); , il sera compilé sans aucun problème, mais il sera échoué au temps d'exécution en casting à la chaîne


3 Réponses :


2
votes

Le casting dans la dernière ligne suggère que List.get (0) ne renvoie pas une chaîne. p>

c'est inexact. Si l'objet retourné n'était pas strong> a chaîne code>, la coulée n'aurait pas été possible. En d'autres termes, vous ne pouvez lancer que quelque chose à string code> si quelque chose est une chaîne code> code>. Essayez de caster autre chose, vous verrez: P>

Object l = list.get(0);
String s = l;


0 commentaires

3
votes

donc j'ai supposé que list.get (0) renvoie un type d'objet.

Oui, c'est.

mais quand je check list.get (0) InstanceOf String -> Il retourne true.

Oui, il devrait renvoyer vrai parce que l'élément d'index 0 de la liste est une chaîne .

Pourquoi est alors le casting explicite requis?

C'est nécessaire simplement parce que la liste contient (code> S et non tous les objets de la liste est garanti pour être une chaîne . La fonte explicite est nécessaire pour que vous puissiez attribuer la référence de list.get.get.get (0) à s (variable de type chaîne ).


4 commentaires

Cette réponse couvre les différentes parties de la question de l'OP, mais une petite addition: les génériques peuvent rendre cela un peu plus simple. La liste peut être définie pour contenir string , comme ceci: Liste Liste = Nouvelle ArrayListe <> (); . Ensuite, un get () ne nécessitera pas de couler, vous pouvez donc le faire: string s = list.get (0);


Merci. Fwiw En général, je ne fais aucune hypothèse sur ce que OP ne sait pas ou ne sait pas. :)


@kaan bien je vois. assez juste et une bonne raison aussi tbh. Je n'aurais pas dû supposer ... :).


Merci les gars! vraiment apprécier la façon dont vous expliquez :)



1
votes

La liste de liste = nouvelle arraylist (); est un type non climatisé (que vous souhaitez éviter), ce qui signifie qu'il peut prendre tout objet . .

Depuis votre liste contient n'importe quel objet objet s, list.get.get.get (0); peut seulement savoir qu'il renvoie un objet et ne sait pas que l'élément à 0 est en fait une chaîne . Puisque ce n'est pas savoir que c'est vraiment un string Le compilateur vous avertit que vous effectuez une création non cochée de objet à Chaîne .

list.get (0) InstanceOf String renvoie true car il s'agit d'un contrôle d'exécution que l'élément à 0 est en fait une chaîne . .


0 commentaires