java根据泛型类型设计需要重载的API有哪些可能性?
在给定的类Example<A>
中,我需要以下两个函数可用:
void doSomething(Supplier<A>)
<B> void doSomething(Supplier<B>)
实现这一目标的可能性是什么?我知道以下方法:
- 为函数指定不同的名称
- 对第二个定义使用包装类型
WrapperType.of(Supplier<B>)
- 使用将
Example<A>
转换为Example<B>
的函数
还有其他方法吗
我不喜欢1)因为它使我的API变得混乱。2) 非常冗长,因为我必须经常调用上述函数,静态导入在测试代码之外是非常不寻常的。3) 对于我不希望用户“关心”的内部问题非常明确
# 1 楼答案
我找到了另一种方法,指定了
Function<A,B>
的扩展,如下所示:可以在
Function<A,B>
和SpecificFunction<A,C>
上定义多个重载,由于类型擦除,如果没有额外的类,这是不可能的。这是因为java language specification显式地强制java编译器必须将函数调用绑定到它能找到的最具体的函数。关于如何找到最具体的函数的定义中有一部分如下:如果两个函数m(a)
和n(b)
存在m(a)
比n(b)
更具体,如果b
不是a
的一个亚型,这对我们的SpecificFunction<A,B>
来说是成立的