为什么我的类型Function的vararg不能只接受一个值?

时间:2015-04-13 18:58:22

标签: java java-8 variadic-functions

我正在研究一些HTML格式代码的概括,所以我创建了一个简单的静态方法:

@SafeVarargs
public static <T> String table(List<T> data, Function<T, Object> link, Function<T, Object> ... cols) {
  StringBuilder html = new StringBuilder();
  for(T item : data) {
    html.append("<tr>\n");
    html.append("  <th><a href='").append(link.apply(item)).append("' class='btn btn-default btn-sm'>open</a></th>\n");
    for(Function<T, Object> col : cols) {
      html.append("  <td>").append(col.apply(item)).append("</td>\n");
    }
    html.append("</tr>\n");
  }

  return html.toString();
}

当我用这样的3个参数运行它时:

public static void main(String ... args) {
  List<SOTestModel> data = new ArrayList<SOTestModel>();
  data.add(new SOTestModel(1, "Adam", DateTime.now().minusYears(35)));
  data.add(new SOTestModel(2, "Bob", DateTime.now().minusYears(33)));
  data.add(new SOTestModel(3, "Carl", DateTime.now().minusYears(30)));

  System.out.println(table(data, r->r.getId(), r->r.getName(), r->r.getCreated().toString("YYYY-MM-dd")));
}

我得到以下输出:

<tr>
  <th><a href='1' class='btn btn-default btn-sm'>open</a></th>
  <td>Adam</td>
  <td>1980-04-13</td>
</tr>
<tr>
  <th><a href='2' class='btn btn-default btn-sm'>open</a></th>
  <td>Bob</td>
  <td>1982-04-13</td>
</tr>
<tr>
  <th><a href='3' class='btn btn-default btn-sm'>open</a></th>
  <td>Carl</td>
  <td>1985-04-13</td>
</tr>

但是,当我只传递vararg的一个参数时,这样:

public static void main(String ... args) {
  List<SOTestModel> data = new ArrayList<SOTestModel>();
  data.add(new SOTestModel(1, "Adam", DateTime.now().minusYears(35)));
  data.add(new SOTestModel(2, "Bob", DateTime.now().minusYears(33)));
  data.add(new SOTestModel(3, "Carl", DateTime.now().minusYears(30)));

  System.out.println(table(data, r->r.getId(), r->r.getName()));
}

我得到指向The target type of this expression must be a functional interface的编译器错误r->r.getName()。我可以通过添加带有以下签名的第二个table()函数来解决这个问题(没有vararg):

public static <T> String table(List<T> data, Function<T, Object> link, Function<T, Object> col) {... same body ...}

但是我想要了解的是为什么?

0 个答案:

没有答案