Java Enum в Perl Inline Java - PullRequest
       0

Java Enum в Perl Inline Java

0 голосов
/ 04 июня 2018

Я использую Inline :: Java для вызова библиотеки Java из моего кода Perl.Однако есть один вызов функции, который я не могу заставить работать, потому что он требует типа enum в качестве аргумента.

Это мои сигнатуры метода Java:

public class Initializer {
  [...]     
  public int initializeExtractor() {...}
  public int initializeExtractor(Language... languages) {...}

Я пытаюсь вызвать последнийверсия на Perl:

use Inline (
    Java => 'STUDY',

    [...]
    AUTOSTUDY => 1,
    STUDY     => [
               [...],
               'package.Language'
    ],

    JNI     => 0,
);

[...]

my $instance = package::Initializer->new( $self->directory() );
$instance->initializeExtractor($package::Language::ENGLISH);

Это сообщение об ошибке:

In method initializeExtractor of class package::Initializer: Can't find any signature that matches the arguments passed (package::Language=HASH(0x2328708)).
Available signatures are:
    initializeExtractor([Lpackage.Language;)
        error was: package.Language is not a kind of [Lpackage.Language; at /usr/local/lib/perl5/site_perl/5.22.4/x86_64-linux-thread-multi/Inline/Java/Object.pm line 107.

    initializeExtractor()
        error was: Wrong number of arguments at /usr/local/lib/perl5/site_perl/5.22.4/x86_64-linux-thread-multi/Inline/Java/Object.pm line 107. at /.../PP.pm line 57.

Вызов первого метода (initializeExtractor(), без аргументов) работает так хорошо, поэтому я уверен, чтомои «учебы» в порядке.Однако, согласно этой теме , я думаю, что я правильно обращаюсь к перечислению Java.

Тот факт, что метод Java имеет аргументы varargs , кажется несвязано со мной, не так ли?

Сообщение об ошибке кажется немного вводящим в заблуждение, поскольку похоже, что первая сообщаемая доступная подпись точно соответствует аргументу, который я передаю.

1 Ответ

0 голосов
/ 04 июня 2018

Аргумент varargs связан с вами.Объявление public int initializeExtractor(Language... languages) {...} определяет метод, который ожидает массив из Language объектов, но предоставляет синтаксический сахар, так что вызов Java с одним аргументом Language преобразуется в массив с одним элементом, но выглядит как Inline::Java пакет в Perl не подслащен таким образом:

package.Language is not a kind of [Lpackage.Language;

, т. е. один аргумент package.Language - это не то же самое, что список package.Language объектов.Вы можете явно предоставить список из Perl, но заключив аргумент в [ скобки ].

$instance->initializeExtractor( [ $package::Language::ENGLISH ] );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...