Java传递和构造类作为函数参数

时间:2014-03-30 00:57:16

标签: java

我使用的是名为Mallet的库。它是迄今为止我用过的最复杂的Java库。他们提供教程和代码模板,我试图理解它。但是,我遇到了这行代码:

TransducerEvaluator evaluator = new MultiSegmentationEvaluator(
                new InstanceList[]{trainingData, testingData},
                new String[]{"train", "test"}, labels, labels) {
              @Override
              public boolean precondition(TransducerTrainer tt) {
                // evaluate model every 5 training iterations
                return tt.getIteration() % 5 == 0;
              }
         };

请不要过分关注术语"换能器"。什么传递给这个功能?两节课?这是new String[]{}的内容是什么?我对此语法非常困惑,因为我以前从未见过它。

这是此方法的代码:

public MultiSegmentationEvaluator (InstanceList[] instanceLists, String[] instanceListDescriptions,
            Object[] segmentStartTags, Object[] segmentContinueTags)

有人能告诉我这个怪异的构造是什么吗?

3 个答案:

答案 0 :(得分:1)

这个结构做了几件事:

  • 创建MultiSegmentationEvaluator的子类,而不为其命名
  • 提供precondition(TransducerTrainer tt)方法
  • 的覆盖
  • 通过将两个字符串数组然后labels传递给带有四个参数的构造函数来实例化新定义的匿名类。
  • 将新创建的实例分配给evaluator变量。

代码使用Java的匿名类功能 - 当您必须子类化或实现接口时,这是一个非常方便的工具,但您定义的类仅用于程序中的一个位置。

答案 1 :(得分:0)

考虑以下代码:

String[] stringArr = new String[]{"train", "test"};

现在有意义了吗?它是一个String数组! =)这里有更愚蠢的代码来证明我的观点:

new String[]{"train", "test"}.getClass() == String[].class

答案 2 :(得分:-1)

InstanceList[]

意味着你需要有一个类型为InstanceList的对象列表,String []也是如此 对于这些:

Object[]

表示任何Object的子类(任何对象)都可以作为最后两个参数的参数传递。

在顶部代码中,这正是他们正在做的事情,但他们为InstanceList和String创建新对象,然后标签是他们传递的2个对象。