8
votes

Les tableaux sont réifiés en Java

J'ai récemment rencontré cela, les tableaux sont réifiés à Java. C'est-à-dire qu'ils connaissent les informations de type uniquement pendant le temps d'exécution. Mais je suis un peu confus avec cette définition.

Si des tableaux sont indiqués pour connaître les informations de type uniquement pendant l'exécution, je devrais littéralement être capable d'affecter toutes les valeurs à n'importe quel tableau, car la saisie est connue uniquement au moment de l'exécution et les erreurs seront seules au moment de l'exécution uniquement. Mais ce n'est pas le cas en temps réel. Nous obtenons une erreur de temps de compilation pour cela.

alors quelqu'un peut jeter la lumière sur "Qu'est-ce que cela signifie que par des tableaux sont réifiés"?


4 commentaires

Parlez-vous de Tableaux génériques ?


@Sam: Ouais. J'ai eu la pensée que tous les tableaux sont réifiés. N'est-ce pas le cas? De votre question semble que, seuls les tableaux génériques sont réifiés!


Oui, et la raison est pour code hérité , ce qui signifie la conserver compatible avec des codes non génériques. Et je crois que cela s'appelle Erasure de type .


Est-ce que réifié stand pour exécution d'exécution identifié ?


4 Réponses :


9
votes

Ce que je pense que cela signifie que les lignes de code données lanceront une exception: xxx

Les tableaux sont covariants: la chaîne [] étend l'objet []. Mais le type réel de la matrice est connu au moment de l'exécution et une tentative de stockage d'une instance qui n'est pas du type droit jette une exception.


0 commentaires

6
votes

Je crois que le terme que vous recherchez est réifiable .

Un type réifiable ne perd aucune information de type dû à l'effacement de type au moment de l'exécution. Des exemples de types de réifiabilité incluent:

  • Primitives
  • Types de référence non génériques
  • Tableaux ou primitifs ou tableaux de types de référence non génériques.

    réifiable ne signifie pas qu'un type n'est pas connu au moment de la compilation. Ce que cela signifie signifie que quelque chose comme ce qui suit, ne peut pas être tapé coché: xxx

    Les tableaux portent des informations d'exécution sur les types qu'ils stockent. Les types non recensés ne peuvent pas être vérifiés lors de l'exécution, ce qui ne leur fait pas de bons candidats au type de composant d'un tableau.

    Lorsque vous utilisez des types de réaffectation comme type de composant d'un tableau tel que String [] Les informations complètes du type sont disponibles au moment de l'exécution, de sorte que les chèques de type peuvent être effectués. xxx

    sources:

    http://docs.oracle.com/javase/tatutorial/java/generics/nonreifiablevarargstype.html http://www.angelikalanger.com/genericsfaq/faqsections/techniqueDétails.html#faq106 (bon)


2 commentaires

Si le type est connu au moment de la compilation, considérez la réponse à cette question par JB Nizet. Dans l'exemple, nous obtenons une exception d'exécution (ArrayStoreException). Ils ne sont-ils pas vérifiés pendant le temps d'exécution lui-même? Je suis désolé si la question est trop naïve.


@shar votre droite, j'ai étiqueté cette exception mal dans le commentaire, je viens de remarquer ça. L'exemple d'usine essayait simplement d'illustrer une décomption ArraystoreException qui n'a pas pu être traitée lors de la compilation en raison de la nature dynamique du code.



3
votes

Si les matrices connaissent les informations de type uniquement pendant l'exécution, je devrais littéralement pouvoir attribuer toutes les valeurs à n'importe quel tableau, car la saisie est connue uniquement aux erreurs de temps d'exécution uniquement au moment de l'exécution. Mais ce n'est pas le cas en temps réel. Nous obtenons une erreur de temps de compilation pour cela.

Les types de réaffectables connaissent leur type à l'heure d'exécution et l'heure de compilation, c'est pourquoi le compilateur vous empêchera de faire des erreurs idiotes où elle peut (quel est le point de les laisser passer?)

Cependant, il y a des moments où le compilateur ne peut pas toujours fonctionner pour déterminer si une affectation (par exemple) sera valide car elle ne connaît pas les types exacts , et c'est là que réifiez Les types peuvent vérifier. Par exemple: xxx

... Cela compilera, car sur la deuxième ligne, le compilateur connaît uniquement le type statique de la matrice en tant que objet , ATTENDU QUE le type dynamique est quelque chose de plus spécifique. Il échouera à titre d'exception à l'exécution, qu'il ne peut faire que parce que (Contrairement aux classes de collecte génériques), le type spécifique est connu au moment de l'exécution.


0 commentaires

1
votes

Comme mentionné dans Doc :

Un type réifiable est un type dont les informations de type sont entièrement disponibles. à l'exécution. Cela inclut des primitives, des types non génériques, des types bruts, et des invocations de caractères génériques non liés.

types non réifiables sont des types où les informations ont été supprimées à Temps de compilation par type Erasure - Invocations de types génériques qui sont non défini comme des caractères génériques sans bornes. Un type non réifiable n'a pas Toutes ses informations disponibles au moment de l'exécution. Exemples de non-réifiable Les types sont la liste et la liste; Le JVM ne peut pas dire à la Différence entre ces types au moment de l'exécution. Comme indiqué dans les restrictions sur Generics, il existe certaines situations où des types non réifiables ne peut pas être utilisé: dans une instance d'expression, par exemple, ou en tant que élément dans un tableau.

Les tableaux sont donc réifiés et covariants mais les génériques sont invariants et de type éliminé par la nature. Les tableaux fournissent la sécurité et le lancer d'exécution ArrayStore EXCEPTION Si l'élément du type correct n'est pas ajouté.


0 commentaires