如何强制JRuby使用java long而不是Fixnums初始化java ArrayList?

如何强制JRuby使用java long而不是Fixnums初始化java ArrayList?,ruby,jruby,jruby-java-interop,Ruby,Jruby,Jruby Java Interop,我的团队中有人正在编写一个ruby/cucumber测试,该测试调用一个java api,该api使用列表参数。我试图帮助他,但我的jruby知识非常有限。每当调用接受List的java方法时,java方法就会抛出某种类型的类强制转换异常,因为ArrayList包含所有rubyFixnum对象 下面的简化代码显示我总是得到一个Fixnum而不是Java::JavaLang::Long irb(main):017:0> java.util.ArrayList.new([12.to_java]

我的团队中有人正在编写一个ruby/cucumber测试,该测试调用一个java api,该api使用
列表
参数。我试图帮助他,但我的jruby知识非常有限。每当调用接受
List
的java方法时,java方法就会抛出某种类型的类强制转换异常,因为ArrayList包含所有ruby
Fixnum
对象

下面的简化代码显示我总是得到一个Fixnum而不是Java::JavaLang::Long

irb(main):017:0> java.util.ArrayList.new([12.to_java])[0].class
=> Fixnum
尽管下面显示12.to_java会产生一个长的

irb(main):018:0> 12.class
=> Fixnum
irb(main):019:0> 12.to_java.class
=> Java::JavaLang::Long 
我也尝试过不使用构造函数参数

irb(main):020:0> a = java.util.ArrayList.new
=> #<Java::JavaUtil::ArrayList:0x314e60d2>
irb(main):021:0> a.add(12.to_java)
=> true
irb(main):022:0> a[0].class
=> Fixnum
irb(main):020:0>a=java.util.ArrayList.new
=> #
irb(main):021:0>a.add(12.to_java)
=>正确
irb(主):022:0>a[0]。类
=>Fixnum
甚至可以直接实例化java.lang.Long

irb(main):023:0> a = java.util.ArrayList.new
=> #<Java::JavaUtil::ArrayList:0xfdcb343>
irb(main):024:0> a.add(java.lang.Long.new(12))
=> true
irb(main):025:0> a[0].class
=> Fixnum
irb(main):023:0>a=java.util.ArrayList.new
=> #
irb(main):024:0>a.add(java.lang.Long.new(12))
=>正确
irb(主):025:0>a[0]。类
=>Fixnum
我最后一次尝试

irb(main):026:0> b = 12.to_java
=> #<Java::JavaLang::Long:0x244ff48e>
irb(main):027:0> b.class
=> Java::JavaLang::Long
irb(main):028:0> a = java.util.ArrayList.new
=> #<Java::JavaUtil::ArrayList:0x6a36ebaa>
irb(main):029:0> a.add b
=> true
irb(main):030:0> a.get(0).class
=> Fixnum
irb(main):026:0>b=12.to_java
=> #
irb(主):027:0>b级
=>Java::JavaLang::Long
irb(main):028:0>a=java.util.ArrayList.new
=> #
irb(主):029:0>a.添加b
=>正确
irb(主):030:0>a.get(0).class
=>Fixnum

事实上,这比您想象的要容易得多,如果您只需传递一个
[]
环绕:)

虽然在Ruby端,JRuby确保值与Ruby类似,但当它到达Java端时,如果RubyArray实例传递给Java(实际上实现了
Java.util.List
),它将自动转换为“toJava”。对于Ruby Fixnums,您将在
java.util.List#get
等操作上获得
java.lang.Long

public class JavaAPI {
    public void testListArgument(final List<Long> list) {
        System.out.println("list = " + list + " list.class = " + list.getClass() + " list[0].class = " + list.get(0).getClass());
    }
}

上面的问题是一个兔子洞,而不是真正的问题(正如我所怀疑的)。我选择了下面更详细的答案。我仍然不知道为什么
12.to_java
会生成一个
java::JavaLang:Long
,但是当它被放入java
列表中时,它会被转换回
Fixnum
。但这绝对不是@kares所说的问题
jruby-1.7.16 :007 > $CLASSPATH << 'target/classes'
 => ["file:/opt/local/rvm/rubies/jruby-1.7.16/lib/ruby/shared/readline/jline-2.11.jar", "file:/opt/local/rvm/rubies/jruby-1.7.16/lib/ruby/shared/readline/readline.jar", "file:target/classes/"] 
jruby-1.7.16 :009 > Java::JavaAPI.new.testListArgument [1]
list = [1] list.class = class org.jruby.RubyArray list[0].class = class java.lang.Long
 => nil