Ruby to Java 変換表

JRubyからJavaのメソッドを呼ぶ場合、メソッドの引数は自動で型変換される。
Javaのメソッドの引数を具体的な型で定義したとき、Rubyのどの型を受け入れられるか調べた。
(以下のようなメソッドをJRubyから引数に様々なものを入れて呼び出してみた)

	public static void i(int i){
		System.out.println(i);
	}

プリミティブ型

Java引数型 Ruby -> Java
boolean nil/false -> false, true -> true
char nil -> '\0', Fixnum/Float -> char
byte nil -> 0, Fixnum/Float -> byte
short nil -> 0, Fixnum/Float -> short
int nil -> 0, Fixnum/Float -> int
long nil -> 0, Fixnum/Float -> long
float nil -> 0.0, Fixnum/Bignum/Float -> float
double nil -> 0.0, Fixnum/Bignum/Float -> double

Wrapperクラスもnil -> nullになるほかは同じだった。

BigIntegerとString

Java引数型 Ruby -> Java
BigInteger Fixnum/Bignum/Float -> BigInteger
String String/Symbol -> String

Number型、BigDecimal型は型変換されずダメだった。(nilのみ受け入れ)

Collection

Java引数型 Ruby -> Java
List Array -> org.jruby.RubyArray(implements List)
Collection Array -> org.jruby.RubyArray(implements Collection)
Iterable Array -> org.jruby.RubyArray(implements Iterable)
Map Hash -> org.jruby.RubyHash(implements Map)

RubyArrayはList,Collection,Iterableを実装している。
ArrayList, HashMapなどの具象クラスは型変換されない。
(RubyArrayはArrayListではないので当然か)


Set, HashSetはダメだった。

配列

Java引数型 Ruby -> Java
Object[] [1,2]/[1,2].to_java -> Object[](中身はLong)
int[] [1,2]/[1,2].to_java :int -> int[]
Long[] [1,2]/[1,2].to_java :Long -> Long[]


一般的に使うものはわりとよく変換できてるみたい。