Java 函数的参数是否需要可选接口?

Lir*_*aro 7 java generics java-8

我在 Java(版本 8)中有两个非常相似的接口。我无法更改接口,也无法更改实现它们的类。

public interface A {
    int get();
}

public interface B {
    int get();
    int somethingelse();
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个函数,它的实现适合两个接口(几乎)。我希望它做这样的事情:

public int foo((A | B) p) {
    int ret = 0;
    if (p instanceof B) {
        ret = p.somthingelse();
    }
    return ret + p.get();
}
Run Code Online (Sandbox Code Playgroud)

我不想使用检查,因为这个函数在我程序的主管道上。我希望它具有良好的性能。是否可以在 Java 中执行此操作?

编辑:

一个简单的解决方案是foo()为每个接口复制/粘贴并以不同的方式实现它。但实际上foo(),接口比这长得多,我正在努力避免代码重复。

ern*_*t_k 3

不幸的是,没有办法在两个不相关的类型之间创建这种追溯关系。

如果您可以更改foo()及其调用,您就可以使用与您在 内部调用的签名相匹配的功能接口foo。我在这里使用的是使用和IntSupplier的具体实现的相应 lambda 表达式。AB

假设您有这些实现:

class AImpl implements A {
     //implementation
}
class BImpl implements B {
     //implementation
}
Run Code Online (Sandbox Code Playgroud)

您可以更改foo为类似以下内容:

public int foo(IntSupplier get, IntSupplier somethingElse) {
    int ret = 0;
    if (somethingElse != null) {
        ret = somethingElse.getAsInt();
    }
    return ret + get.getAsInt();
}
Run Code Online (Sandbox Code Playgroud)

并这样称呼它:

A a = new AImpl();
B b = new BImpl();

int result = this.foo(a::get, b::somethingelse);
Run Code Online (Sandbox Code Playgroud)