我正在研究一些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 ...}
但是我想要了解的是为什么?