49 votes

Obtention du tableau Class d'un type de composant

Si j'ai une instance de Class , est - il un moyen d'obtenir un Class par exemple pour son type de tableau? Ce que je demande essentiellement, c'est l'équivalent d'une méthode getArrayType qui est l'inverse de la méthode getComponentType() , telle que :

 array.getClass().getComponentType().getArrayType() == array.getClass()

15voto

FroMage Points 1700

En fait à cause de ClassLoader , des primitives et des tableaux multidimensionnels, la réponse est un peu plus complexe :

 public static Class<?> getArrayClass(Class<?> componentType) throws ClassNotFoundException{
    ClassLoader classLoader = componentType.getClassLoader();
    String name;
    if(componentType.isArray()){
        // just add a leading "["
        name = "["+componentType.getName();
    }else if(componentType == boolean.class){
        name = "[Z";
    }else if(componentType == byte.class){
        name = "[B";
    }else if(componentType == char.class){
        name = "[C";
    }else if(componentType == double.class){
        name = "[D";
    }else if(componentType == float.class){
        name = "[F";
    }else if(componentType == int.class){
        name = "[I";
    }else if(componentType == long.class){
        name = "[J";
    }else if(componentType == short.class){
        name = "[S";
    }else{
        // must be an object non-array class
        name = "[L"+componentType.getName()+";";
    }
    return classLoader != null ? classLoader.loadClass(name) : Class.forName(name);
}

9voto

Peter Lawrey Points 229686

Vous pouvez faire ce qui suit

 array.getClass() == 
    Array.newInstance(array.getClass().getComponentType(), 0).getClass()

Habituellement, vous n'avez pas besoin de connaître le type, vous voulez juste créer le tableau.

2voto

Leigh Klotz Points 46

Une autre refactorisation possible consiste à utiliser une superclasse générique et à passer deux objets de classe au constructeur.

 protected AbstractMetaProperty(Class<T> valueClass, Class<T[]> valueArrayClass) {
  this.valueClass = valueClass;
  this.valueArrayClass = valueArrayClass;
}

Puis en sous-classes :

 public IntegerClass() {
  super(Integer.class, Integer[].class);
}

Ensuite, dans la classe abstraite, vous pouvez utiliser valueClass.cast(x) , valueArrayClass.isInstance(x) etc.

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