作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个 Java 接口(interface)(版本 8),它们非常相似。我无法更改接口(interface),也无法更改实现它们的类。
public interface A {
int get();
}
public interface B {
int get();
int somethingelse();
}
现在我有一个函数,它的实现适合两个接口(interface)(几乎)。我希望它做类似的事情:
public int foo((A | B) p) {
int ret = 0;
if (p instanceof B) {
ret = p.somthingelse();
}
return ret + p.get();
}
我不想使用检查,因为这个函数位于我程序的主管道上。我希望它有良好的性能。在 Java 中可以做到这一点吗?
一个简单的解决方案是复制/粘贴 foo()
并为每个接口(interface)以不同的方式实现它。但实际上 foo()
和接口(interface)比这长得多,我试图避免代码重复。
最佳答案
不幸的是,没有办法在两个不相关的类型之间创建这种追溯关系。
如果您可以更改 foo()
及其调用,您就可以使用与您在 foo
内调用的签名相匹配的函数接口(interface)。我在这里使用 IntSupplier
,以及使用 A
和 B
的具体实现的相应 lambda 表达式。
假设您有这些实现:
class AImpl implements A {
//implementation
}
class BImpl implements B {
//implementation
}
您可以将 foo
更改为:
public int foo(IntSupplier get, IntSupplier somethingElse) {
int ret = 0;
if (somethingElse != null) {
ret = somethingElse.getAsInt();
}
return ret + get.getAsInt();
}
这样调用它:
A a = new AImpl();
B b = new BImpl();
int result = this.foo(a::get, b::somethingelse);
关于java - Java 函数的参数是否需要可选接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59237393/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!