将对象从Java传递到Jython时保留Java类型

时间:2009-04-03 12:13:18

标签: java python jython

我想知道当你把Java对象放到Java ArrayList中时,是否有可能将jython automagicly转换为python类型。

从jython-console复制的示例:

>>> 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-Class:

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'。如果你想运行这段代码,你还需要可以找到here的JythonFactory类。

1 个答案:

答案 0 :(得分:1)

您似乎使用旧版本的Jython。在当前的Jython版本中,Python bool类型对应于Java Boolean

Jython在进入ArrayList的过程中没有将Java类型转换为Python类型 - 相反,它将原始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 {{1} }}