Сохранение Java-типа объекта при передаче его из Java в Jython - PullRequest
5 голосов
/ 03 апреля 2009

Интересно, возможно ли , а не , чтобы 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, который можно найти здесь .

1 Ответ

1 голос
/ 03 апреля 2009

Вы, кажется, используете старую версию Jython. В текущих версиях Jython тип Python bool соответствует Java Boolean.

Jython не преобразует тип Java в тип Python по пути в ArrayList - напротив, он преобразует примитивный тип Python в примитивный или тип-обертку Java при передаче его методу Java, и тип Java для типа Python на выходе.

Вы можете наблюдать это, печатая содержимое массива. Обратите внимание, что Python bool пишется с большой буквы (True); Java Boolean нет.

>>> 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]

Если это все еще не делает то, что вы хотите, подумайте о написании небольшой вспомогательной функции Java, которая проверяет массив для вас без преобразования. Возможно, ошибка в том, что Jython автоматически не конвертирует Boolean, который вы создали, в Python bool, и в этом случае он не дает вам никаких преимуществ по сравнению с Boolean.TRUE или Python True.

...