有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java根据泛型类型设计需要重载的API有哪些可能性?

在给定的类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) 个答案

  1. # 1 楼答案

    我找到了另一种方法,指定了Function<A,B>的扩展,如下所示:

    class SpecificFunction<A,B> extends 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>来说是成立的