2009-04-03 8 views
5

Me pregunto si es posible no tener jython automáticamente transformar objetos de Java a tipos de pitón cuando los pones en una Java ArrayList.Preservar el tipo de Java de un objeto al pasarlo de Java a Jython

Ejemplo copiado de un jython-consola:

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

Hasta ahora, todo está bien, pero si pongo el objeto en un ArrayList

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

el objeto se transforma en una serpiente pitón similar booleano (es decir, un int) y ...

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

lo que significa que ya no puedo ver que esto era una vez aj ava.lang.Boolean.

Aclaración

Creo que lo que realmente quiere lograr es la de deshacerse de la conversión implícita de tipos de Java-a-Python tipos al pasar objetos de Java a Python. Daré otro ejemplo de aclaración. Módulo

una pitón:

import java 

import IPythonModule 

class PythonModule(IPythonModule): 

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

Y un Java-clase que utiliza este módulo:

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")); 
    } 
} 

Aquí voy a ver la salida 'bool' debido a la conversión implícita, pero lo que realmente me gustaría es ver 'javainstance' o 'java.lang.Boolean'. Si desea ejecutar este código, también necesitará la clase JythonFactory que se puede encontrar en here.

Respuesta

1

Parece que está utilizando una versión anterior de Jython. En las versiones actuales de Jython, el tipo de Python bool corresponde a Java Boolean.

Jython no está transformando el tipo de Java en un tipo de Python en el camino al ArrayList; al contrario, transformará un tipo de Python primitivo en un tipo primitivo o envoltorio de Java al pasarlo a un método Java, y Tipo de Java a un tipo de Python en el camino de salida.

Puede observar esto imprimiendo el contenido de la matriz. Tenga en cuenta que el Python bool está en mayúscula (True); el Java Boolean no lo es.

>>> 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 esto todavía no hace lo que quiere, que no hacer una función auxiliar pequeño de Java que examina la matriz para usted sin necesidad de conversión. Podría decirse que es un error que Jython no convierte automáticamente el Boolean que construyó en un Python bool, y en este caso no le da ninguna ventaja sobre el uso de Boolean.TRUE o el Python True.

+0

Sí, estoy usando la última versión estable, 2.2.1 que no tiene soporte para el tipo de bool de pitón ... Descargando 2.5b en este momento ... –

+0

>>> b = java.lang.Boolean ("true "); >>> l = java.util.ArrayList(); >>> l.add (b) verdadero >>> tipo (l.obtener (0)) >>> isinstance (l.get (0), java.lang.Boolean) Falso Por lo que yo puedo ver, la conversión tiene lugar todavía, y es esta conversión que Don no quiero –

+0

En realidad, hay 2 conversiones potenciales que suceden aquí, una entrando en la matriz y otra saliendo. Cuando está en ArrayList, tiene un java.lang.Boolean, que puede ver porque se imprime con una 't' minúscula. –

Cuestiones relacionadas