5

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 クラスも必要になります

4

1 に答える 1

1

古いバージョンの Jython を使用しているようです。現在の Jython バージョンでは、Pythonbool型は Java に対応しますBoolean

Jython は、途中で Java 型を Python 型に変換しませんArrayList。逆に、Java メソッドに渡すときにプリミティブ Python 型をプリミティブまたはラッパー Java 型に変換し、Java 型を Python に渡します。途中で入力します。

これは、配列の内容を出力することで確認できます。Pythonboolは大文字 ( True) であることに注意してください。JavaBooleanはそうではありません。

>>> 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 ヘルパー関数を作成することを検討してください。BooleanJython が構築した を Pythonに自動的に変換しないのは間違いなくバグであり、この場合、または Pythonboolを使用するよりも利点はありません。Boolean.TRUETrue

于 2009-04-03T13:35:01.413 に答える