指定之前/之后的泛型方法引用类型 :: 运算符

2022-09-03 01:25:23

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

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;

这些案例是否有特殊名称?有没有类似于用法的例子?


答案 1

首先,这被称为类型见证在官方的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>Listcontains


答案 2

在:

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

<String>是非泛型方法1 的类型参数。List.contains

在:

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

<String>是 的类型参数。List


1 - 在此特定情况下,根据 JLS §15.12.2.1 忽略类型参数:

非泛型方法可能适用于提供显式类型参数的调用。在这种情况下,类型参数将被忽略。


推荐