我想知道当你把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类。
答案 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} }}