2017-08-27 4 views
0

Donc, je ne peux simplement pas rassembler l'accès aux valeurs dans les tableaux statiques constants.Accéder aux tableaux constants statiques à partir du modèle Jtwig

Que ce soit un tableau dans mon code:

public static int[] MY_ARRAY; 

Et voilà comment je tente d'accéder à ce tableau:

{{ constant("com.package.configs.MainConfig.MY_ARRAY")[0] }} 

Cette tentative conduit à une erreur:

java.lang.ClassCastException: [I cannot be cast to [Ljava.lang.Object; 
    at org.jtwig.value.convert.collection.ArrayToCollectionConverter.convert(ArrayToCollectionConverter.java:11) 
    at org.jtwig.value.convert.CompositeConverter.convert(CompositeConverter.java:15) 
    at org.jtwig.render.expression.calculator.MapSelectionExpressionCalculator.calculate(MapSelectionExpressionCalculator.java:19) 
    at org.jtwig.render.expression.calculator.MapSelectionExpressionCalculator.calculate(MapSelectionExpressionCalculator.java:12) 
    at org.jtwig.render.expression.CalculateExpressionService.calculate(CalculateExpressionService.java:14) 
... 

J'ai également essayé d'affecter d'abord une constante à la variable, puis j'y ai accédé, mais rien n'a changé.

Auparavant, dans une ancienne version de JTwig, j'étais capable d'accéder à n'importe quel champ statique public d'un objet que je passais au modèle. Mais maintenant de tels champs sont ignorés.

La version que j'utilise est 5.86.0. Une idée sur comment vaincre ça, ou en ce moment c'est techniquement impossible?

Répondre

0

L'exception

java.lang.ClassCastException: [I cannot be cast to [Ljava.lang.Object;

signifie le tableau MY_ARRAY est un int tableau -type, et int est un primitive, donc ce n'est pas un sous-type de Object, si vous ne pouvez pas jeter un Object - type tableau. Dans ce cas, vous pouvez remplacer la signature MY_ARRAY par public static Integer[] MY_ARRAY.

Integer enveloppe la valeur int dans un Object.

Ceci est illustré par l'exemple suivant:

public static void main(String args[]) { 
    int[] arr = new int[5]; 
    Integer[] arrI = new Integer[5]; 
    test(arr); // error:The method test(Object[]) in the type Demo is not applicable for the arguments (int[]) 
    test(arrI); // ok 
} 
+0

Oui, merci pour l'indice, celui-ci fonctionne comme prévu. Mais que faire si je ne peux pas changer le code avec lequel je suis en train de travailler? Juste pour une instance. Je peux accéder à n'importe quel tableau (objet ou primitif) de Nashorn. – VirtualVoid

+0

Je ne connais pas Nashorn, mais je pense qu'il a deux ou plusieurs méthodes de surcharge avec des arguments de type différents, donc quand vous utilisez des arguments de types différents pour appeler, vous appelez en fait différentes méthodes. – Leeqihe