java - 指定之前/之后 :: 运算符的通用方法引用类型
问题描述
以下方法参考有什么区别,
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;
案件有特殊名称吗?有没有类似用法的例子?
解决方案
首先,这被称为类型见证(在官方 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
- 但它不是通用的,所以它被忽略了。
推荐阅读
- typescript - 如何在 FP 尤其是 fp-ts 中管理 monad
- java - 如何在 Java 中的 HandleBar 中进行货币格式化?
- python - 使用 Turtle 的 Sierpinski 地毯 Python 错误
- javascript - 不允许使用 Django 方法 (POST) 405
- sql - SAP HANA SQL 匹配字符串模式和组合
- bash - 从文件中读取一列,将每个元素增加一个常量,然后在 bash 中重写回文件
- matlab - 使用 Slurm 调度程序在集群的多个节点上运行单个 Matlab parpool 作业
- javascript - 如何使用javascript(仅深色)获得随机颜色?
- python - 数独拼图与包含平方数的框
- vue.js - 无法使用 vue-utils 向我的测试脚本添加观察者