При вызове Java-метода из JRuby выдается сообщение об ошибке "нет конструктора для аргументов"

Я пытаюсь инициализировать этот класс из библиотеки программирования ограничений JaCop из jRuby. Я использую правильный тип аргументов, но по некоторым причинам я продолжаю получать это сообщение об ошибке:

  NameError: no constructor for arguments
    (
      org.jruby.RubyArray,
      org.jruby.RubyArray,
      org.jruby.RubyArray,
      JaCoP.core.IntVar,
      JaCoP.core.IntVar)
    on Java::JaCoPConstraintsKnapsack::Knapsack
    (root) at rb/knapsack.rb:24

Код, на который он указывает, таков:

k = Jacop::Knapsack.new(@values, @weights, quantity, knapsackCapacity, knapsackProfit)

Подпись конструктора класса Java такова:

public Knapsack(int[] profits,
                int[] weights,
                IntVar[] quantity,
                IntVar knapsackCapacity,
                IntVar knapsackProfit)

Я не понимаю, почему jRuby жалуется, что конструктор не найден, потому что он должен быть в состоянии найти это.

1 ответ

Решение

JRuby не всегда может угадать "сложные" аргументы метода для вас, вы можете попробовать:

Jacop::Knapsack.new(@values, @weights, quantity.to_java(JaCoP.core.IntVar), knapsackCapacity, knapsackProfit)

или даже помогая с int[] приведение (не обязательно):

Jacop::Knapsack.new(@values.to_java(:int), @weights.to_java(:int), quantity.to_java(JaCoP.core.IntVar), knapsackCapacity, knapsackProfit)

Другие вопросы по тегам