Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jython如何处理java类型?_Java_Python_String_Dictionary_Jython - Fatal编程技术网

jython如何处理java类型?

jython如何处理java类型?,java,python,string,dictionary,jython,Java,Python,String,Dictionary,Jython,我被要求编写一个jython程序,使用一些java类作为数据,因为整个程序最终将集成到一个更大的java框架中 我很难理解jython是如何处理这些java类的。例如,如果我声明一个java字符串,jython将不允许我为它分配任何东西,只允许分配一个字符串。但是,如果我声明一个映射,jython似乎允许我将其视为python dict,但不会对键或值施加类型约束 如果私有变量是字符串,它也不允许我重新分配它,但是如果它是映射,它会重新分配 下面是一个示例java类: import java.u

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

我很难理解jython是如何处理这些java类的。例如,如果我声明一个java字符串,jython将不允许我为它分配任何东西,只允许分配一个字符串。但是,如果我声明一个映射,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;
    }
}
import java.util.Map;
导入java.util.HashMap;
公开庭审{
私有字符串名称;
私有地图mydict;
公开审判(){
this.name=“Default”;
this.mydict=newhashmap();
}
公开审判(字符串名称){
this.name=名称;
this.mydict=newhashmap();
}
公共字符串getName(){
返回此.name;
}
公共地图getmydict(){
返回此.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'>
>>导入试用版
>>>x=试验(123)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:Trial():无法将第一个参数强制为字符串
>>>x=试验(“名称”)
>>>x.姓名
你的名字
>>>x.name=“其他名称”
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:只读属性attr:名称
>>>x.mydict[“a”]=1
>>>x.mydict[2]=“b”
>>>x.mydict
{2:b,a:1}
>>>类型(x.mydict)
因此,name被约束为字符串,并且在创建之后是只读的,因为我没有编写setter函数。但是mydict,它应该是一个HashMap对象,似乎能够同时保存字符串和整数作为键或值,并且可以写入,即使我没有setter


谁能解释一下类型约束是如何保持的,或者java/python类型是如何相互映射的?我能找到的唯一文档是和。它们都没有描述如何跨语言边界引用python字典或java映射。另外,类型转换对性能有什么影响?每个转换都有开销吗?

一些进一步的细节:看起来我无法写入mydict-此命令引发错误:>>>x.mydict={},但显然我仍然可以使用字典函数。x、 mydict.keys()和x.mydict.values()确实有效,我可以在python理解或for循环中使用x.mydict。