Java中能否将恒等函数声明为字段并保留泛型特性?
能否将Function.identity()声明为泛型字段?
目前
java.util.function.Function#identity被声明为每次调用都会返回新函数的方法,代码如下:static <T> Function<T, T> identity() { return t -> t; }请问是否可以将其声明为字段同时仍保留泛型?
答案是肯定的,但得借助通配符+强制类型转换来实现,而且这个转换是安全的——毕竟恒等函数的逻辑就是返回输入本身,不管处理的是什么类型,行为都完全一致。
具体实现可以参考下面的代码:
import java.util.function.Function; public class FunctionUtils { // 用通配符声明一个单例的恒等函数字段 private static final Function<?, ?> IDENTITY_SINGLETON = t -> t; // 对外提供泛型方法,内部做安全的类型转换 @SuppressWarnings("unchecked") public static <T> Function<T, T> identity() { return (Function<T, T>) IDENTITY_SINGLETON; } }
这里的核心细节:
- 静态字段没法直接拥有专属的泛型参数,所以用
Function<?, ?>来作为通用的单例实例 - 借助静态泛型方法做类型转换,因为我们明确知道这个恒等函数不会引发类型错误,所以加上
@SuppressWarnings("unchecked")消除编译器警告 - 这种写法能让每次调用
identity()都返回同一个实例,避免了原方法每次创建新Lambda的微小开销
不过JDK本身并没有采用这种实现方式,大概率是因为Lambda创建的开销极低,几乎可以忽略;同时这种单例+类型转换的写法,可能会让部分开发者产生类型安全方面的疑惑,不如直接返回Lambda来得直观易懂。
内容的提问来源于stack exchange,提问作者piotrek
相关产品推荐
相关产品推荐

