2009-04-03 5 views
5

ではなくでは、Java ArrayListに入れた際にjythonがJavaオブジェクトをPython型に自動的に変換することができますか? JythonのコンソールからコピーJavaからJythonに渡すときにオブジェクトのJava型を保持する

例:

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

これは、これが以前はajだったことがもう分かりませんava.lang.Boolean。私は本当に達成したいと思い

明確化

は、PythonにJavaからオブジェクトを渡すときのPythonの型へのJava-型から暗黙の変換を取り除くことです。わかりやすくするために別の例を挙げます。

A Pythonモジュール:ここで

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")); 
    } 
} 

は私が原因で暗黙の型変換の出力 'ブール' を参照しますが、私はこのモジュールを使用しています

import java 

import IPythonModule 

class PythonModule(IPythonModule): 

    def method(self, data): 
     print type(data); 

とJavaクラス本当に好きなのは 'javainstance'や 'java.lang.Boolean'です。このコードを実行したい場合は、hereというJythonFactoryクラスも必要です。

答えて

1

あなたはJythonの古いバージョンを使用しているようです。現在のJythonバージョンでは、Python boolタイプはJava Booleanに対応しています。

JythonはArrayListの途中でJavaの型をPython型に変換しません。逆に、Javaのメソッドに渡すときにプリミティブなPython型をプリミティブ型またはラッパー型に変換します。 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がをPython boolに自動的に変換しないバグがあります。この場合、Boolean.TRUEやPython Trueを使用するよりも利点はありません。

+0

はい私はpython boolタイプのサポートを持たない2.2.1の最新の安定版を使用しています...今すぐ2.5bをダウンロードしています... –

+0

>>> b = java.lang.Boolean( "true "); >>> l = java.util.ArrayList(); >>> ladd(b) True >>> type(l。(0)) >>>でisinstance(l.get(0)、java.lang.Booleanの) 偽 私の知る限り見ることができるように、変換がまだ行われ、それがこの変換であるIドンを取得欲しい。 –

+0

ここで2つの潜在的な変換が実際に起こっています.1つはアレイに入り、もう1つは出てきます。 ArrayListの中には、java.lang.Booleanがあります。これは小文字の 't'で表示されるため、表示されます。 –

関連する問題