Je pense que je manque quelque chose de base ici. Toute explication ou des pointeurs aux questions précédemment posées sera très utile.
import java.util.Arrays; import java.util.List; public class St { public static void bla(Object[] gaga) { gaga[0] = new Date(); // throws ArrayStoreException System.out.println(gaga[0]); } public static void bla(List<Object> gaga) { System.out.println(gaga.get(0)); } public static void main(String[] args) { String[] nana = { "bla" }; bla(nana); // Works fine List<String> bla1 = Arrays.asList(args); bla(bla1); // Wont compile System.out.println(new String[0] instanceof Object[]); // prints true System.out.println(nana.getClass().getSuperclass().getSimpleName()); // prints Object } }
5 Réponses :
Les tableaux Java sont Covariant , c'est-à-dire qu'ils autorisent Objet [] FOO = nouvelle chaîne [2]; code>. Mais cela ne signifie pas qu'ils sont des sous-classes.
string [] code> est une sous-classe de
objet code> (Bien que
instanceOf code> renvoie true,
string []. Class.Getsuperclass () Code > retour
objet code>) p>
De @maerics commentaire ci-dessous - la nouvelle chaîne de la nouvelle chaîne [0] de l'objet de [0] code> retourne vrai. Donc, la chaîne [] est un type d'objet et un type d'objet [] et un type de charcutage [], etc. Correct?
@Kal qui semble être un cas particulier pour couvrir la covariance. Voir ma mise à jour
chaîne []> 1 objet code> semble être un bug, je ne peux pas obtenir
getcuperclass code> pour renvoyer un tableau pour n'importe quel autre type i>. Mais Java.sun.com/docs/books / jls / tiers_edition / html / ... semble dire que c'est ce qu'il devrait être
(new String[0] instanceof Object[]) // => true
Vous êtes correct. Les types de tableau sont covariants en java par design, mais un foo code> est-pas-a
foo
Oui, votre hypothèse est valide. Comme indiqué par @bozho, les tableaux sont covariants, alors que les collections génériques (telles que la liste générique) ne sont pas covariantes.
Covariance dans les matrices est risqué: p>
String[] strings = new String[] { "a", "b" } Object[] objects = strings; objects[0] = new Date(); // <-- Runtime error here String s = strings[0]; s.substring(5, 3); // ????!! s is not a String
Merci .. Je n'ai jamais vu la tremaystoréexception auparavant.
chaîne [] est une sous-classe d'objet [] p>
Correct, voir 4.10.3 Sous-tytyping parmi Types de tableau : P>
Si S et T sont les deux types de référence, alors S []> 1 T [] IFF S> 1 t. P> blockQuote>
depuis
string> 1 objet code> donc
string []> 1 objet [] code> p>
c'est,
] code> est un fort> sous-type direct fort> de
objet [] code> p>
objet> 1 objet [] p> blockQuote>
là-bas
objet> string [] code>;
chaîne [] code> est un (indirect?) sous-type fort> de
objet code> p>
Aucune relation de ce type n'existe pour les génériques, donc
Liste
> Liste code> n'est pas vrai. p> maintenant, considérez l'exemple simple suivant: p>
xxx pré> Il ne compile pas, car
x code> invoque
allf code> avec une liste
code> qui est pas em> une liste code>. Pour pouvoir utiliser
Liste
code> la signature doit modifier légèrement: p> xxx pré> Il compile maintenant. Informellement,
li code> est une liste code> de certains em> type em> qui s'étend / implémente I. SO
Liste
code> est < em> attribuable à em> list s'étend i> code>. Ce que vous pouvez faire avec une telle liste est limité. Essentiellement, vous pouvez le lire / l'accéder mais ne peut pas
écrire / modifier code>. p> blockQuote>
Umm ... Sous-type et sous-classe signifient différentes choses.
@Stephenc, pour les classes sous-tendance est identique à la sous-classement, si je lisez 4.10.2 . Je suppose que la réponse correcte serait "des tableaux ne sont pas des cours afin qu'ils ne puissent pas avoir une relation de sous-classe mais string [] est i> a sybtype i> de objet []". Est-ce ce que vous allumez?