Интересно, возможно ли , а не , чтобы jython автоматически преобразовывал объекты Java в типы Python, когда вы помещаете их в Java ArrayList.
Пример, скопированный с консоли jython:
>>> b = java.lang.Boolean("True");
>>> type(b)
<type 'javainstance'>
>>> isinstance(b, java.lang.Boolean);
1
Пока все хорошо, но если я помещаю объект в ArrayList
>>> l = java.util.ArrayList();
>>> l.add(b)
1
>>> type(l.get(0))
<type 'int'>
объект преобразуется в логический тип, похожий на python (т.е. int), и ...
>>> isinstance(l.get(0), java.lang.Boolean)
0
, что означает, что я больше не вижу, что когда-то это был java.lang.Boolean.
Разъяснение
Полагаю, что действительно нужно добиться, так это избавиться от неявного преобразования типов Java в типы Python при передаче объектов из Java в Python. Я приведу еще один пример для пояснения.
Модуль Python:
import java
import IPythonModule
class PythonModule(IPythonModule):
def method(self, data):
print type(data);
И Java-класс, который использует этот модуль:
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"));
}
}
Здесь я увижу вывод «bool» из-за неявного преобразования, но мне действительно хотелось бы видеть «javainstance» или «java.lang.Boolean». Если вы хотите запустить этот код, вам также понадобится класс JythonFactory, который можно найти здесь .