JavaオブジェクトをJava ArrayListに入れるときに、jythonがJavaオブジェクトを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 クラス:
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 クラスも必要になります。