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(),接口比这长得多,我正在努力避免代码重复。
不幸的是,没有办法在两个不相关的类型之间创建这种追溯关系。
如果您可以更改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)
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |