سؤال

هل هناك طريقة يمكنني من خلالها إلقاء كائن Java بشكل صريح إلى فئة Java أخرى من Jruby؟

في بعض الأحيان أريد أن أكون قادرًا على الاحتجاج SomeJavaClass#aMethod(MySuperClass) عوضا عن SomeJavaClass#aMethod(MyClass) من Jruby.

من جافا ، سأفعل هذا:

someJavaObject.aMethod( (MySuperClass) myObj );

لكنني لم أر #cast طريقة روبي أو أي شيء من هذا القبيل للقيام بما يعادل jruby.

ملحوظة هذا السؤال صب كائنات جافا من jruby يفتقر إلى إجابة للحالة العامة ، وهذا هو السبب في أنني أعيد صياغة السؤال.

هل كانت مفيدة؟

المحلول

تحتاج إلى الاستفادة من ميزة #java_send أو #java_alias المتاحة بدءًا من JRuby 1.4 لتحديد الطريقة التي ترغب في الاتصال بها. مثال:

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top