8
votes

Java: Création multidimensionnelle générique

Comment faire un réseau multidimensionnel d'éléments génériques dans Java?

Considérez la classe: p> xxx pré>

lorsque j'essaie de créer un tableau multidimensionnel: P >

A<String>[][] array = (A<String>[][]) (new Object[2]3]);


4 commentaires

Vous voudrez peut-être regarder Stackoverflow.com/ Questions / 529085 / ... et Stackoverflow.com/Questions/ 3865946 / ... .


Quelle est votre raison d'insister sur des tableaux plutôt que d'autres types de collecte?


Vous jetez un objet [] [] à une [] [], les 2 ne sont pas compatibles.


@Gareth McCaughan - Les tableaux sont plus faciles à indexer que les listes. Array [i] [J] [J] est plus lisible que array.get (i) .get (j) . Lorsque vous codez un algorithme complexe, cela est vraiment utile.


7 Réponses :


4
votes

J'ai pu faire quelque chose comme ça xxx

edit:

de la suggestion de @ dsg Les suivants sautent la création d'un temporaire objet. xxx

ou (suggestion de @ ORDREPUTABLE) xxx


2 commentaires

Je crois que ce qui suit fonctionne également: `@suppresswarnings (" non cochéra ") a [] [] [] [] = (a [] [] []) java.lang.reflect.array.newinstance (A.Class, 2 , 3);


@DSG Vous êtes extrêmement drôle. Array.Newinstance (A.Class, 2, 3) est exactement le même que nouveau A [2] [3]



1
votes

Merci aux commentaires que j'ai capables de créer une solution.

Comme nous l'avons vu, a [] [] tableau = nouveau a [2] [3]; code> ne fonctionne pas. p>

ici Comment construire un 2x3 code> tableau de A code> objets qui fonctionnent: p>

@SuppressWarnings("unchecked")
A<String>[][] array = (A<String>[][]) java.lang.reflect.Array.newInstance(A.class,2,3);


3 commentaires

Existe-t-il un moyen d'obtenir la classe de l'objet de base sans l'instancier?


Pendant que je suis content que vous ayez compris cela, la question brûlante est toujours pourquoi aller à tous ces problèmes sur l'utilisation de ArrayList > ?


Non, c'est le problème. Avant de l'instancier, il n'ya pas de moyen de déterminer son type. Consultez ma réponse, vous pouvez utiliser a [] [] pour votre tableau.



2
votes

Vous ne pouvez pas créer de gamme de génériques spécifiques à un type de manière simple.

List<String>[] list = new List<String>[2]; //Illegal
List<?> aa[] = new List<?>[2]; // OK
...
A<?>[][] array = new A<?>[2][3]; // OK
A[0][0] = new A<String>(...);


2 commentaires

C'est cool! Je suppose que vous pouvez faire a [] [] [] [] = (a [] [] []) nouveau A [2] [3];


Ouais, mais de cette façon, vous aurez une avertissement de moulage non coché, pour empêcher son ajout d'ajouter @suppresswarnings ("non coché")



0
votes

hmm, je pensais que les matrices Java (à partir de Java 6) n'ont pas soutenu des génériques. Un de mes plus gros "WTF" lorsque j'ai commencé à programmer avec des génériques en Java.


0 commentaires

1
votes

Pourquoi ne faites-vous pas quelque chose comme ceci: (non générique) xxx

et faire une classe d'utilitaire pour implémenter les fonctions que vous avez effectuées dans a (comme je suppose qu'il y en a). EG:

Lorsque vous avez eu ceci dans a : xxx

Vous pouvez faire une classe d'utilité: < Pré> xxx


0 commentaires

1
votes

neuf a [] [] et le jeter à a [] []


0 commentaires

0
votes
class A<T> 
{
    T s;

    public A(T t)
    {
        s = t;
    }

    public String getType()
    {
        return s.getClass().toString();
    }

    public T getThing()
    {
        return s;
    }
}

public static void main(String[] args) 
{
    A<?>[][] a = new A<?>[2][3];
    a[0][1] = new A<String>("hi");

    System.out.println(a[0][1].getType());
    System.out.println(a[0][1].getThing());

    A<String> b = (A<String>) a[0][1];
}
output:
class java.lang.String
hi

0 commentaires