我有一些无法修改的代码。这也意味着,我无法将Implements关键字添加到类声明中。
我想实现一个方法,该方法可以采用该类的实例,并假设在那里实现了许多方法。理想情况下,应由编译器强制执行
我可以在运行时使用反射来做到这一点。但是由于使用反射的缺点(性能,可读性等),我试图避免这种情况。如果一个类不遵守接口,我还必须处理运行时错误而不是编译器错误。
示例:
replace(field("adft.ati", String.class), inline(":"), inline(""))
现在我有一些方法:
public interface Foo {
boolean foo();
}
public class Bar {
// Doesn't implement Foo interface but adheres to it
boolean foo() {
return true;
}
}
public class Bar2 {
// Doesn't implement or adhere to interface
boolean bar() {
return false;
}
}
我可以这样称呼:
public someMethod(Foo foo) {
System.out.println(foo.foo());
}
这在Java中可行吗?
答案 0 :(得分:2)
将它们包装在确实实现接口的委托类中。
class NiceFoo implements Bar {
private final Foo delegate;
NiceFoo(final Foo delegate) {
this.delegate = delegate;
}
@Override
void bar() {
delegate.bar();
}
}
如果您不喜欢样板,请龙目岛(Lombok)营救。这与上述完全等效,并且将自动委派添加到Bar中的所有方法。如果Foo没有相关方法,则会出现编译时错误。
@AllArgsConstructor
class NiceFoo implements Bar {
@Delegate(types = Bar.class)
private final Foo foo;
}