jython如何处理java类型?

时间:2017-10-05 12:15:51

标签: java python string dictionary jython

我被要求编写一个使用一些java类作为数据的jython程序,因为整个程序最终会被集成到一个更大的java框架中。

我无法理解jython如何处理这些java类。例如,如果我声明一个java字符串,jython不会让我为它分配除字符串之外的任何东西。但是,如果我声明一个Map,jython似乎让我把它当作一个python dict,但不会对键或值施加类型约束。

如果它是一个字符串,它也不会让我重新分配私有变量,但如果它是地图,那么它将会被重新分配。

这是一个示例java类:

import java.util.Map;
import java.util.HashMap;

public class Trial {

    private String name;
    private Map<String, Integer> mydict;

    public Trial() {
        this.name = "Default";
        this.mydict = new HashMap<String,Integer>();
    }

    public Trial(String name) {
        this.name = name;
        this.mydict = new HashMap<String,Integer>();
    }

    public String getName() {
        return this.name;
    }

    public Map<String,Integer> getmydict() {
        return this.mydict;
    }
}

以下是jython解释器的表现:

>>> import Trial
>>> x = Trial(123)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Trial(): 1st arg can't be coerced to String
>>> x = Trial("A name")
>>> x.name
u'A name'
>>> x.name = "Another name"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: read-only attr: name
>>> x.mydict["a"] = 1
>>> x.mydict[2] = "b"
>>> x.mydict
{2: b, a: 1}
>>> type(x.mydict)
<type 'java.util.HashMap'>

所以 name 被限制为一个字符串,并且在创建后是只读的,因为我没有写一个setter函数。但 mydict ,它应该是一个HashMap对象,似乎能够将字符串和整数都作为键或值保存,并且可以写入,即使我没有设置器

任何人都可以解释如何保持类型约束,或者java / python类型如何相互映射?我能找到的唯一文档是herehere。这些都没有描述如何跨语言边界引用python词典或java地图。此外,类型转换对性能有何影响?每次转换都有开销吗?

0 个答案:

没有答案