2009-04-03 3 views
5

Je me demande si possible pas jython automagicaly transformer des objets java en types python lorsque vous les mettez dans une Java ArrayList.Préserver le Java-type d'un objet lors du passage de Java à Jython

Exemple copié à partir d'un Jython console:

>>> b = java.lang.Boolean("True"); 
>>> type(b) 
<type 'javainstance'> 
>>> isinstance(b, java.lang.Boolean); 
1 

Jusqu'à présent, tout va bien, mais si je mets l'objet dans un ArrayList

>>> l = java.util.ArrayList(); 
>>> l.add(b) 
1 
>>> type(l.get(0)) 
<type 'int'> 

l'objet se transforme en un comme python booléen (ie un int) et ...

>>> isinstance(l.get(0), java.lang.Boolean) 
0 

ce qui signifie que je ne vois plus que c'était une fois aj ava.lang.Boolean.

Précision

Je suppose que ce que voulez vraiment atteindre est de se débarrasser de la conversion implicite de Java-types de Python-types lorsque des objets passant de Java à Python. Je vais donner un autre exemple de clarification.

Un module Python:

import java 

import IPythonModule 

class PythonModule(IPythonModule): 

    def method(self, data): 
     print type(data); 

Et Java classe qui utilise ce module:

import java.util.ArrayList; 

import org.python.core.PyList; 
import org.testng.annotations.*; 

import static org.testng.AssertJUnit.*; 

public class Test1 { 

    IPythonModule m; 

    @BeforeClass 
    public void setUp() { 
     JythonFactory jf = JythonFactory.getInstance(); 
     m = (IPythonModule) jf.getJythonObject(
       "IPythonModule", 
     "/Users/sg/workspace/JythonTests/src/PythonModule.py"); 
    } 

    @Test 
    public void testFirst() { 
     m.method(new Boolean("true")); 
    } 
} 

Ici, je vais voir la sortie 'bool' en raison de la conversion implicite, mais ce que je aimerait vraiment voir 'javainstance' ou 'java.lang.Boolean'. Si vous voulez exécuter ce code, vous aurez également besoin de la classe JythonFactory qui peut être trouvée here.

Répondre

1

Vous semblez utiliser une ancienne version de Jython. Dans les versions actuelles de Jython, le type Python bool correspond à Java Boolean. Jython ne transforme pas le type Java en type Python sur le chemin ArrayList - au contraire, il va transformer un type Python primitif en un type Java primitif ou wrapper en le passant à une méthode Java, et un Type Java à un type Python à la sortie.

Vous pouvez observer ceci en imprimant le contenu de la matrice. Notez que le Python bool est mis en majuscule (True); le Java Boolean ne l'est pas.

>>> from java.lang import Boolean 
>>> b = Boolean('True') 
>>> b  
true 
>>> from java.util import ArrayList 
>>> l = ArrayList() 
>>> l.add(b) 
True 
>>> l 
[true] 
>>> l.add(True) 
True 
>>> l 
[true, true] 
>>> list(l) 
[True, True] 

Si cela ne fonctionne toujours pas ce que vous voulez, ne pas ecrire une petite fonction Java aide qui examine le tableau pour vous sans conversion. C'est sans doute un bug que Jython ne convertit pas automatiquement le Boolean que vous avez construit en un Python bool, et dans ce cas il ne vous donne aucun avantage sur l'utilisation de Boolean.TRUE ou le Python True.

+0

Oui J'utilise la dernière version stable, 2.2.1 qui ne supporte pas le type python bool ... Téléchargement 2.5b maintenant ... –

+0

>>> b = java.lang.Boolean ("true "); >>> l = java.util.ArrayList(); >>> l.add (b) Vrai >>> type (l.obtenir (0)) >>> isinstance (l.get (0), java.lang.Boolean) Faux Pour autant que je peux voir, la conversion a toujours lieu, et il est cette conversion que je don Je ne veux pas. –

+0

Il y a en fait 2 conversions potentielles qui se produisent ici, une qui entre dans le tableau et une qui sort. Quand il est dans ArrayList, vous avez un java.lang.Boolean, que vous pouvez voir car il imprime avec un 't' minuscule. –

Questions connexes