8.在Jess中使用Java(上)

8.1.Java映射

上述函数列表中有一组函数专用于直接在Jess中复制Java对象。使用该组函数可以实现,除了定义新的类以外的,所有Java代码。下例中将建立一个名为HashMapJava类,在Jess中使用该类,添加一个新的字串型对象,然后查找一个对象并显示该对象。

Jess> (bind ?ht (new java.util.HashMap)) 
<Java-Object:java.util.HashMap> 
Jess> (call ?ht put "key1" "element1")  
Jess> (call ?ht put "key2" "element2")  
Jess> (call ?ht get "key1") 
"element1" 

 

由此可见,Jess可以自如的在JavaJess类型中转换。不能表示为Jess类型的Java对象称为Java对象值(Java object values)。上例中的HashMap就是其中之一。

大多数时候可以省略调用(call),其符号表示有点类似Java代码。例如:

Jess> (bind ?ht (new java.util.HashMap)) 
<Java-Object:java.util.HashMap> 
Jess> (?ht put "key1" "element1")  
Jess> (?ht put "key2" "element2")  
Jess> (?ht get "key1") 
"element1" 

 

仅当调用静态方法时才必须使用call语句。

通过使用set-memberget-member函数,Jess也能访问Java对象的成员变量(member variables)

Jess> (bind ?pt (new java.awt.Point)) 
<Java-Object:java.awt.Point> 
Jess> (set-member ?pt x 37) 
37 
Jess> (set-member ?pt y 42) 
42 
Jess> (get-member ?pt x) 
37 

 

访问静态成员时,可以使用类名代替对象名作为这些函数的第一个参数。

Jess> (get-member System out) 
<Java-Object:java.io.PrintStream> 

 

注意:不用像在Java中一样使用“java.lang.System”,java.lang包已作为Java代码被隐式的引入JessJess同样拥有import函数可以显示的引入这些包。

Jess根据下表将Java值转换为Jess类型值。

Java type

Jess type

A null reference

The symbol 'nil'

A void return value

The symbol 'nil'

String

RU.STRING

An array

A Jess list

boolean or java.lang.Boolean

The symbols 'TRUE' and 'FALSE'

byte, short, int, or their wrappers

RU.INTEGER

long or Long

RU.LONG

double, float or their wrappers

RU.FLOAT

char or java.lang.Character

RU.SYMBOL

anything else

RU.JAVA_OBJECT

由上表可见JessJess值转为Java类型时比较自由。通常在进行这样的转换时,Jess事先对转换目标有所了解,例如:当Jess有一个java.lang.Class对象和一个jess.Value对象,要将Value对象所含的内容转换为可匹配于由该类命名的Jess类型时。而“TRUE”符号可以传递给以布尔值为参数的函数,或者以字符串为参数的函数,这两种情况下都可以用call调用。

 

 

 

Jess type

Possible Java types

RU.JAVA_OBJECT

The wrapped object

The symbol 'nil'

A null reference

The symbols 'TRUE' or 'FALSE'

java.lang.Boolean or boolean

RU.SYMBOL, RU.STRING

String, char, java.lang.Character

RU.FLOAT

float, double, and their wrappers

RU.INTEGER

long, short, int, byte, char, and their wrappers

RU.LONG

long, short, int, byte, char, and their wrappers

RU.LIST

A Java array

在调用(call)超载的方法(method)时可能会遇到麻烦——例如:将“TRUE”传递给一个已超载而无法接受布尔值或字符串作为参数的Java方法。此时可以显式的使用包类(wrapper class)——本例中可使用java.lang.Boolean对象解决该问题。

要了解更多的关于call,new,set-member,get-member及其它Java综合函数,请参见Jess函数使用指南(Jess function guide)

你可能感兴趣的:(java)