首页 > 解决方案 > Perl 内联 Java 中的 Java 枚举

问题描述

我使用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()不带参数)工作得很好,这就是为什么我很确定我的“研究”很好。但是,根据这个线程,我认为我确实以正确的方式访问了 Java 枚举。

Java方法具有可变参数的事实似乎与我无关,是吗?

该错误消息似乎有点误导,因为它看起来第一个报告的可用签名与我传递的参数完全匹配。

标签: javaperlenums

解决方案


varargs 参数与您有关。该声明public int initializeExtractor(Language... languages) {...}定义了一个方法,该方法需要一个对象数组Language,但提供了语法糖,以便将带有单个Language参数的 Java 调用强制转换为带有一个元素的 Array,但看起来Inline::JavaPerl 中的包并没有以这种方式进行优化:

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

即,单个package.Language参数与package.Language对象列表不同。您可以从 Perl 显式提供列表,但将参数括在[括号中]

$instance->initializeExtractor( [ $package::Language::ENGLISH ] );

推荐阅读