关于 BeanShell 的更多内容请点击此处

执行一个显示的类型转换将 BeanShell 脚本对象转换到一个接口类型是合法的行为,但通常没有这个必要。
示例代码

 
  
  1. actionPerformed( event ) { 
  2. print( event ); 
  3. button.addActionListener( 
  4. (ActionListener)this ); // 添加了显示转换 

在上面的代码中,当 BeanShell 尝试匹配 addActionListener() 方法签名的“this”类型参数时,它可能早已完成了 ActionListener 的类型转换。

显示地执行类型转换具有同样的效果,但是内部采用了不同的路线。通过显示类型转换,在转换的同时 BeanShell 首先创建了必要的适配器实现 ActionListener 接口,然后查找一个最匹配的方法。

那这有什么不同?当然,有时当类型被创建时在哪里执行一个显示的转换来控制可能是重点。具体得说,当你传递引用到你的脚本之外时,对于 Java 类来说不会自动用预期的类型来使用它们。我们之前讨论中提到过自动类型转换发生“在你的 BeanShell 脚本中”。到目前为止的例子里,BeanShell 总有机会将脚本对象在传递之前转换成正确的类型。但是你可以传递一个“this”引用给一个方法,比如传递“Object”类型,这种情况 BeanShell 可能没有办法在之后的使用中知道它是什么类型。你也许可以做到,比如,如果你将脚本对象放到某个类型的集合里(Map 或者 List)。这样你就可以在引用离开你的脚本之前控制执行一个显示的类型转换到想要的类型的过程。

另一种情况,你可能不得不在某个地方执行一个类型转换,这说明你正在一个嵌入式的应用中使用 BeanShell 并且从 Interpreter 类返回脚本对象作为一个 eval() 或者 get() 的变量的结果。这又是一个 BeanShell 没有办法在脚本中知道它预期类型的例子。你可以在引用离开你的脚本之前通过执行一个显示的类型转换来创建该类型。

在之后的章节我们会讨论 BeanShell 嵌入式应用,使用 Interpreter 类的 getInterface() 方法。那是在一个脚本外完成这种类型转换的另一种方法。