根据泛型类型设计需要重载的API的可能性是什么?

时间:2019-05-12 11:39:59

标签: java functional-programming api-design

在给定的类Example<A>中,我需要以下两个功能可用:

void doSomething(Supplier<A>)

<B> void doSomething(Supplier<B>)

实现此目标的可能性是什么?我知道以下方法:

  1. 为函数指定不同的名称
  2. 将包装类型用于第二个定义WrapperType.of(Supplier<B>)
  3. 使用将Example<A>转换为Example<B>的函数

还有其他方法吗?

我不喜欢1),因为它会使我的API混乱。 2)确实很冗长,因为我必须经常调用函数,静态导入在测试代码之外非常罕见。 3)非常明确地表达了我不想让用户“关心”的内部问题

1 个答案:

答案 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的子类型。