결론부터 얘기하자면, Java의 variable number of arguments(이하 varargs)를 가진 Java 메서드를 JRuby 코드에서 호출하려면, 여러 argument들을 나열하거나 Ruby Array를 사용하면 안되고, Java array 객체를 생성해주어야한다. Java의 varargs는 Java array와 동일하게 취급되므로 당연히 Java array의 경우에도 마찬가지다. 그렇다면, Ruby Array는 무엇이랑 대응될까? 바로 java.util.List
다.
다음은 이러한 동작을 테스트하기 위한 간단한 Java 클래스. 위에서 언급한대로, Java array parameter를 varargs로 보면 되겠다.
import java.lang.String;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;public class Song {public enum Category {
POP, ROCK, CLASSIC, JAZZ
}private String title;
private List<Category> categories = new ArrayList<Category>();public Song(String title) {
this.title = title;
}public void setCategory(Category category) {
this.categories.clear();
this.categories.add(category);
}public void setCategoryList(List<Category> categories) {
this.categories.clear();
this.categories.addAll(categories);
}public void setCategories(Category[] categories) {
this.categories.clear();
this.categories.addAll(Arrays.asList(categories));
}
public String toString() {
return "Title: " + title + " Categories: " + categories;
}
}
다음은 위의 Java 클래스를 사용하는 JRuby 코드.
require 'java'
include_class 'Song'
song = Song.new 'Waiting On The World To Change'
puts songsong.setCategory Song::Category::POP
puts songcategories = Array.new
categories.push Song::Category::POP
categories.push Song::Category::ROCK
puts categories.length
puts categories.size
song.setCategoryList categories
puts songcategories = Song::Category[].new 2
#categories.add Song::Category::POP # not working
categories[0] = Song::Category::POP
categories[1] = Song::Category::CLASSIC
puts categories.length
#puts categories.size # not working
song.setCategories categories
puts song