天天看點

java怎麼轉換類型_如何将Jython類型轉換為Java類型

Jython類型映射 Java類型

有時會需要在 Jython 中建立純 Java 對象(例如,在需要建立跨網絡發送給基于 Java 的伺服器的對象、或者在需要向一個類型敏感的 Java 服務(如帶有 Swing 表格單元值的服務)傳遞對象時)。要将 Jython類型轉換為 Java類型(以及相反),使用下面例子中的函數:defmapMapFromJava (map):

""" Convert a Map to a Dictionary. """

result = {}

iter = map.keySet().iterator()

whileiter.hasNext():

key = iter.next()

result[mapFromJava(key)] = mapFromJava(map.get(key))

returnresult

defmapCollectionFromJava (coll):

""" Convert a Collection to a List. """

result = []

iter = coll.iterator();

whileiter.hasNext():

result.append(mapFromJava(iter.next()))

returnresult

defmapFromJava (object):

""" Convert a Java type to a Jython type. """

ifobjectisNone:returnobject

ifisinstance(object, util.Map):

result = mapMapFromJava(object)

elifisinstance(object, util.Collection):

result = mapCollectionFromJava(object)

else:

result = object

returnresult

defmapSeqToJava (seq):

""" Convert a sequence to a Java ArrayList. """

result = util.ArrayList(len(seq))

foreinseq:

result.add(mapToJava(e));

returnresult

defmapDictToJava (dict):

""" Convert a Dictionary to a Java HashMap. """

result = util.HashMap()

forkey, valueindict.items():

result.put(mapToJava(key), mapToJava(value))

returnresult

defmapToJava (object):

""" 将Jython類型轉換為Java類型 """

ifobjectisNone:returnobject

t = type(object)

ift == TupleTypeort == ListType:

result = mapSeqToJava(object)

elift == DictType:

result = mapDictToJava(object)

else:

result = object

returnresult

在使用了 mapToJava 後,這些類型可以寫為java.io.ObjectOutputStream。從 java.io.ObjectInputStream 讀出一個對象後,可以用 mapFromJava 将對象轉換回 Jython 類型。

注意這些方法支援有限的、但是廣泛使用的一組内置 Jython類型。Jython 自動轉換類似值的類型,如數字和字元串。不支援使用者定義的類。

映射Java類型

繼續這個例子,下面顯示了繼續使用上一屏讨論的映射函數的情況:data = (1,2,3, [1,2,3], [cforcin"Hello!"],"Hello!", {1:'one',2:'two'})

print"data:", data

toJava = mapToJava(data)

print"toJava:", toJava

fromJava = mapFromJava(toJava)

print"fromJava:", fromJava

print

print"type(%s)=%s"% ("data", type(data))

print"type(%s)=%s"% ("toJava", type(toJava))

print"type(%s)=%s"% ("fromJava", type(fromJava))

列印:data: (1,2,3, [1,2,3], ['H','e','l','l','o','!'],'Hello!', \

{2:'two',1:'one'})

toJava: [1,2,3, [1,2,3], [H, e, l, l, o, !], Hello!, {2=two,1=one}]

fromJava: [1,2,3, [1,2,3], ['H','e','l','l','o','!'],'Hello!', \

{2:'two',1:'one'}]

type(data)=org.python.core.PyTuple

type(toJava)=org.python.core.PyJavaInstance

type(fromJava)=org.python.core.PyList

注意 PyTuple變成了 PyJavaInstance,然後是 PyList.還要注意 toJava 表單的格式不一樣了。這是因為它是一個 Java 對象,并且它是由 Java toString() 方法而不是 Jython repr()函數列印的。Jython 将 PyJavaInstance 這種類型原樣傳遞給 Java API。 ***,注意 data 和 fromJava 值是相同的,隻不過元組現在是一個相應的清單。

【編輯推薦】

【責任編輯:楊賽 TEL:(010)68476606】

點贊 0