我被要求编写一个使用一些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类型如何相互映射?我能找到的唯一文档是here和here。这些都没有描述如何跨语言边界引用python词典或java地图。此外,类型转换对性能有何影响?每次转换都有开销吗?