2009-04-03 35 views
5

Tôi tự hỏi nếu nó có thể không có jython automagicaly chuyển đổi các đối tượng java thành các kiểu python khi bạn đặt chúng trong một ArrayList Java.Bảo quản kiểu Java của một đối tượng khi chuyển nó từ Java sang Jython

Ví dụ sao chép từ một Jython-console:

>>> b = java.lang.Boolean("True"); 
>>> type(b) 
<type 'javainstance'> 
>>> isinstance(b, java.lang.Boolean); 
1 

Cho đến nay, mọi thứ đều tốt nhưng nếu tôi đưa các đối tượng trong một ArrayList

>>> l = java.util.ArrayList(); 
>>> l.add(b) 
1 
>>> type(l.get(0)) 
<type 'int'> 

đối tượng được chuyển đổi thành một con trăn giống boolean (tức là an int) và ...

>>> isinstance(l.get(0), java.lang.Boolean) 
0 

có nghĩa là tôi không thể thấy rằng điều này đã từng là aj ava.lang.Boolean.

Làm rõ

Tôi đoán những gì thực sự muốn đạt được là để thoát khỏi sự chuyển đổi ngầm từ Java-loại để Python-loại khi vượt qua các đối tượng từ Java để Python. Tôi sẽ đưa ra một ví dụ khác để làm rõ.

Một Python module:

import java 

import IPythonModule 

class PythonModule(IPythonModule): 

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

Và một Java-Class sử dụng mô-đun này:

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

Ở đây tôi sẽ thấy đầu ra 'bool' vì sự chuyển đổi ngầm, nhưng những gì tôi thực sự muốn là xem 'javainstance' hoặc 'java.lang.Boolean'. Nếu bạn muốn chạy mã này, bạn cũng sẽ cần lớp JythonFactory có thể được tìm thấy here.

Trả lời

1

Dường như bạn đang sử dụng phiên bản cũ của Jython. Trong các phiên bản Jython hiện tại, loại Python bool tương ứng với một Java Boolean.

Jython không chuyển loại Java sang kiểu Python trên đường vào ArrayList - ngược lại, nó sẽ biến đổi kiểu Python nguyên thủy thành kiểu Java nguyên thủy hoặc bao bọc khi chuyển nó sang phương thức Java và Java loại cho một loại Python trên đường ra.

Bạn có thể quan sát điều này bằng cách in nội dung của mảng. Lưu ý rằng Python bool được viết hoa (True); Java Boolean thì không.

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

Nếu điều này vẫn không làm những gì bạn muốn, hãy xem xét viết một hàm trợ giúp Java nhỏ để kiểm tra mảng cho bạn mà không cần chuyển đổi. Nó được cho là một lỗi mà Jython không tự động chuyển đổi các Boolean bạn xây dựng thành một Python bool, và trong trường hợp này nó mang lại cho bạn không có lợi thế hơn bằng cách sử dụng Boolean.TRUE hoặc Python True.

+0

Có Tôi đang sử dụng phiên bản ổn định mới nhất, 2.2.1 không hỗ trợ loại bool trăn ... Tải xuống 2.5b ngay bây giờ ... –

+0

>>> b = java.lang.Boolean ("true "); >>> l = java.util.ArrayList(); >>> l.add (b) True >>> type (l.có được (0)) >>> isinstance (l.get (0), java.lang.Boolean) False Theo như tôi thấy, chuyển đổi vẫn diễn ra, và nó là chuyển đổi này mà tôi don không muốn. –

+0

Thực sự có 2 chuyển đổi tiềm năng xảy ra ở đây, một chuyển đổi thành mảng và một sắp ra mắt. Khi nó nằm trong ArrayList, bạn đã có một java.lang.Boolean, bạn có thể thấy nó vì nó in bằng chữ thường 't'. –

Các vấn đề liên quan