【问题标题】:Casting objects in JRuby在 JRuby 中转换对象
【发布时间】:2010-12-20 00:48:52
【问题描述】:

有没有一种方法可以将一个 Java 对象从 JRuby 显式转换为另一个 Java 类?

有时我希望能够从 JRuby 调用 SomeJavaClass#aMethod(MySuperClass) 而不是 SomeJavaClass#aMethod(MyClass)

在 Java 中,我会这样做:

someJavaObject.aMethod( (MySuperClass) myObj );

但我没有看到 #cast ruby​​ 方法或类似的方法来执行 JRuby 中的等效操作。

请注意,问题 Casting Java Objects From JRuby 缺少一般情况的答案,这就是我重新提出问题的原因。

【问题讨论】:

    标签: java casting jruby jruby-java-interop


    【解决方案1】:

    您需要使用从 JRuby 1.4 开始提供的 #java_send#java_alias 功能来选择您希望调用的方法。示例:

    class Java::JavaUtil::Arrays
      boolean_array_class = [false].to_java(:boolean).java_class
      java_alias :boolean_equals, :equals, [boolean_array_class, boolean_array_class]
    end
    
    a1 = [false, true]
    Java::JavaUtil::Arrays.boolean_equals a1, a1
    # => TypeError: for method Arrays.equals expected [class [Z, class [Z]; got: [org.jruby.RubyArray,org.jruby.RubyArray]; error: argument type mismatch
    Java::JavaUtil::Arrays.boolean_equals a1.to_java(:boolean), a1.to_java(:boolean)
    # => true
    a2 = [true, false]
    Java::JavaUtil::Arrays.boolean_equals a1.to_java(:boolean), a2.to_java(:boolean)
    # => false
    

    【讨论】:

    • 我认为如果您尝试转换为非原始类,您应该使用完整的层次结构,这将是有用的。所以,比如说,要将obj 转换为ij.text.TextWindow 类,你必须写obj.to_java(Java::Ij::text::TextWindow)
    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多