我使用 Inline::Java从我的 Perl 代码调用 Java 库。但是,有一个函数调用我无法开始工作,因为它需要一个枚举类型作为参数。
这些是我的 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()
,不带参数)效果很好,这就是为什么我很确定我的“研究”很好。
然而,根据this thread ,我想我确实以正确的方式访问了 Java 枚举。
Java 方法有一个 varargs 的事实争论似乎与我无关,是吗?
错误消息似乎有点误导,因为它看起来第一个报告的可用签名与我传递的参数完全匹配。
最佳答案
varargs 参数与您有关。声明 public int initializeExtractor(Language... languages) {...}
定义了一个需要 Language
对象数组的方法,但提供了语法糖,以便 Java使用单个 Language
参数的调用被强制转换为具有一个元素的数组,但看起来 Perl 中的 Inline::Java
包并没有被这样改进:
package.Language is not a kind of [Lpackage.Language;
即,单个 package.Language
参数与 package.Language
对象列表不同。您可以显式提供来自 Perl 的列表,但将参数括在 [
brackets]
中。
$instance->initializeExtractor( [ $package::Language::ENGLISH ] );
关于Perl 内联 Java 中的 Java 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50684643/