Mi chiedo se sia possibile non avere jython automagicaly trasformare oggetti java in tipi python quando li si inserisce in un ArrayList Java.Conservazione del tipo Java di un oggetto quando lo si passa da Java a Jython
Esempio copiato da un Jython-console:
>>> b = java.lang.Boolean("True");
>>> type(b)
<type 'javainstance'>
>>> isinstance(b, java.lang.Boolean);
1
Finora, tutto va bene, ma se metto l'oggetto in un ArrayList
>>> l = java.util.ArrayList();
>>> l.add(b)
1
>>> type(l.get(0))
<type 'int'>
l'oggetto si trasforma in un pitone simile booleano (cioè un int) e ...
>>> isinstance(l.get(0), java.lang.Boolean)
0
che significa che non riesco più a vedere che questa era una volta aj ava.lang.Boolean.
Chiarimento
Credo che quello che veramente vuole raggiungere è quello di sbarazzarsi della conversione implicita da Java-tipi di Python-tipi nel passaggio degli oggetti da Java a Python. Darò un altro esempio di chiarimento. Modulo
un pitone:
import java
import IPythonModule
class PythonModule(IPythonModule):
def method(self, data):
print type(data);
E un Java-classe che utilizza questo modulo:
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"));
}
}
Qui mi vedrà l'uscita di 'bool' a causa della conversione implicita, ma quello che ho mi piacerebbe davvero vedere 'javainstance' o 'java.lang.Boolean'. Se vuoi eseguire questo codice avrai anche bisogno della classe JythonFactory che può essere trovata here.
Sì, sto utilizzando l'ultima versione stabile, 2.2.1 che non supporta il tipo bool Python ... Download 2.5b adesso ... –
>>> b = java.lang.Boolean ("true "); >>> l = java.util.ArrayList(); >>> l.add (b) True >>> tipo (l.ottenere (0)) >>> isinstance (l.get (0), java.lang.Boolean) Falso Per quanto posso vedere, la conversione avviene ancora, ed è questa conversione che don non voglio –
Ci sono in realtà 2 potenziali conversioni che si verificano qui, uno che entra nell'array e uno che esce. Quando si trova in ArrayList, hai un java.lang.Boolean, che puoi vedere perché stampa con una 't' minuscola. –