299 votes

Ce qui ' s la raison pour laquelle je peux ' t créer des types de tableau générique en Java ?

Quel est le motif Java ne nous permet pas de faire

Je comprenais .NET ne permettent de le faire, comme dans .NET vous avez des types de valeur qui, en cours d’exécution peuvent avoir différentes tailles, mais en Java, toutes sortes de T sera références d’objet, donc avoir la même taille (corrigez-moi si je me trompe).

Quelle est la raison ?

233voto

newacct Points 42530

C’est parce que les tableaux de Java (contrairement aux médicaments génériques) contiennent, lors de l’exécution, des informations sur son type de composant. Si vous devez connaître le type de composant lorsque vous créez le tableau. Puisque vous ne savez pas ce que `` est lors de l’exécution, vous ne pouvez pas créer le tableau.

145voto

Bart Kiers Points 79069

Citation:

Les tableaux de types génériques ne sont pas a permis parce que ils ne sont pas de son. L' le problème est dû à l'interaction de Java les tableaux, qui ne sont pas statiquement bruit, mais ils sont dynamiquement vérifié, avec les médicaments génériques, qui sont statiquement son et pas de manière dynamique vérifié. Voici comment vous pouvez exploiter la ouverture:

class Box<T> {
    final T x;
    Box(T x) {
        this.x = x;
    }
}

class Loophole {
    public static void main(String[] args) {
        Box<String>[] bsa = new Box<String>[3];
        Object[] oa = bsa;
        oa[0] = new Box<Integer>(3); // error not caught by array store check
        String s = bsa[0].x; // BOOM!
    }
}

Nous avions proposé de résoudre ce problème de manière statique à l'aide de tableaux sécurisés (aka la Variance) bute qui a été rejeté pour le Tigre.

-- gafter

(Je crois que c'est Neal Gafter, mais je suis pas sûr)

Voir dans son contexte ici: http://forums.sun.com/thread.jspa?threadID=457033&forumID=316

58voto

Peter Lawrey Points 229686

Par défaut de fournir une solution décente, vous venez de vous retrouver avec quelque chose de pire à mon humble avis.

Le travail commun autour est comme suit.

T[] ts = new T[n];

est remplacé par (en supposant que T s'étend de l'Objet et non pas une autre classe)

T[] ts = (T[]) new Object[n];

Je préfère le premier exemple, cependant plus acedemic types semblent préférer la seconde, ou tout simplement préfèrent ne pas la chose à son sujet.

La plupart des exemples de raisons pour lesquelles vous ne pouvez pas simplement utiliser un Objet[] s'appliquent également à la Liste ou de la Collection (qui sont pris en charge), donc je les vois comme de très mauvais arguments.

Remarque: ceci est une des raisons pour lesquelles les Collections de la bibliothèque elle-même ne se compile pas sans avertissements. Si vous avez ce cas d'utilisation ne peut pas être pris en charge sans avertissements, quelque chose est fundermentally rompu avec les génériques de modèle à mon humble avis.

36voto

Durandal Points 9434

La raison que c’est impossible est que Java implémente des fabricants de produits génériques uniquement sur le niveau du compilateur et il n’y a qu’un seul fichier de classe généré pour chaque classe. C’est ce qu’on appelle Type effacement.

Lors de l’exécution, la classe compilée doit gérer l’ensemble de ses usages avec le bytecode du même. Donc « nouveau T [capacité] » n’aurait absolument aucune idée de quel type doit être instancié.

19voto

Ferdi265 Points 810

La réponse a déjà été donnée mais si vous disposez déjà d’une Instance de T puis vous pouvez faire ceci :

Espérons, je pouvais l’aider, Ferdi265

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X