首页 > 解决方案 > 指定之前/之后 :: 运算符的通用方法引用类型

问题描述

以下方法参考有什么区别,

BiPredicate<List<String>,String> contains1 = List<String>::contains;

BiPredicate<List<String>,String> contains2 = List::<String>contains;

BiPredicate<List<String>,String> contains3 = List<String>::<String>contains;

案件有特殊名称吗?有没有类似用法的例子?

标签: javagenericsjava-8method-reference

解决方案


首先,这被称为类型见证在官方 Oracle 教程中)或TypeArguments(在JLS Sec 15.12中),您正在有效地帮助编译器处理此类结构。

一个例子:

private static void test(Callable<Object> call) {

}

private static void test(Runnable run) {

}

static class Gen<T> {

}

并通过调用它test(Gen::new);(这会失败,别管为什么),但关键是你添加了一个类型见证来帮助编译器,所以这会起作用

test(Gen<String>::new);

因此,当您编写时List<String>,您已经为目标类型添加了类型见证 -List即;在第二种情况下,您正在为该方法添加一个contains- 但它不是通用的,所以它被忽略了。


推荐阅读