在给定的类Example<A>
中,我需要以下两个功能可用:
void doSomething(Supplier<A>)
<B> void doSomething(Supplier<B>)
实现此目标的可能性是什么?我知道以下方法:
WrapperType.of(Supplier<B>)
Example<A>
转换为Example<B>
的函数还有其他方法吗?
我不喜欢1),因为它会使我的API混乱。 2)确实很冗长,因为我必须经常调用函数,静态导入在测试代码之外非常罕见。 3)非常明确地表达了我不想让用户“关心”的内部问题
答案 0 :(得分:2)
通过找到Function<A,B>
的扩展名,我找到了另一种方法:
class SpecificFunction<A,B> extends Function<A,B> {}
然后可以在Function<A,B>
和SpecificFunction<A,C>
上定义多个重载,由于类型擦除,如果没有额外的类,这将是不可能的。之所以有效,是因为java language specification明确要求Java编译器必须将函数调用绑定到它可以找到的最特定的函数。如何找到最具体的函数的定义的一部分如下:如果存在{{1},则如果存在两个函数m(a)
和n(b)
m(a)
比n(b)
更具体}}不是b
的子类型,它是我们的a
的子类型。