我在库中有一个interface method
,它由同一个库中的方法调用。实现在包括库的应用程序中。每个应用程序的实现都不同。要调用interface method
,calling method
必须使用其已实施的interface
实例化class
。但由于calling method
位于库中,因此它无法访问应用程序中的类。 calling method
由后台服务启动,而不是由应用程序启动。
库中的接口:
public interface InterfaceA {
void methodA();
}
实现接口的应用程序中的类:
public class ClassA implements InterfaceA {
@Override
public void methodA() {
// do something
}
}
库中调用接口方法的方法:
public void callInterface() {
InterfaceA ia;
ia.methodA(); // how to get this to work?
}
如何在不对应用程序中的interface method
实现进行访问的情况下从库中调用interface
?我无法从我的库中实例化接口,因为实现类位于库无法访问的应用程序中。
答案 0 :(得分:0)
如果你有一个界面实例,你不需要做任何事情来使它工作:
public void callInterface(InterfaceA ia) {
ia.methodA();
}
然后将此参数添加到调用此方法的库方法中,依此类推。当应用程序调用此方法时,它们可以传递它们的实现。
或者,如果您确实需要在方法中实例化接口,请添加另一个接口:
public void callInterface(Supplier<InterfaceA> iaSupplier) {
InterfaceA ia = iaSupplier.get();
ia.methodA();
}
请参阅https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html。
调用方法由后台服务启动,而不是由应用程序启动。
什么启动了后台服务?您需要为应用程序添加一些方法以将实现传递给它。
或者,你可以使用SPI(https://docs.oracle.com/javase/tutorial/ext/basics/spi.html)但它可能有点过分。
答案 1 :(得分:0)
public void callInterface() {
InterfaceA ia;
ia.methodA(); // how to get this to work?
}
上面应该会导致编译问题。
库函数应该将接口InterfaceA作为参数作为参数,如另一个答案中所示。或者如果它是无状态实现,则在使用包含此方法的Class时传递它。