gpt4 book ai didi

java - 抽象类中的 getClass() 返回随机实现类

转载 作者:行者123 更新时间:2023-12-01 18:45:22 40 4
gpt4 key购买 nike

在 OSGi 应用程序中,我有一个类层次结构,如下所示:

public interface IA {
public void someMethod();
}

public abstract class AbstractA implements IA {
public void someMethod(SomeObject s) {
System.out.println(this.getClass());
}
}

public class ImplAA extends AbstractA {
//Some other methods
}

public class ImplAB extends AbstractA {
//Some other methods
}

接口(interface)、抽象类和实现位于 4 个不同的包中。另一个包包含一个如下所示的类:

public class SomeClass {

private IA implAAInstance;
private IA implABInstance;

protected void bindToAA(IA ia) {
implAAInstance = ia;
}

protected void bindToAB(IA ia) {
implABInstance = ia;
}

protected void sendStuff(SomeObject p, SomeObject q) {
implAAInstance.someMethod(p);
implABInstance.someMethod(q);
}
}

方法bindToAAbindToAB是绑定(bind)函数,用于绑定(bind)到包含类ImplAAImplAB的包分别。在 XML 组件定义中,如下所示:

<reference bind="bindToAA" cardinality="0..1" interface="path.to.IA" name="ImplAA" policy="dynamic"/>
<reference bind="bindToAB" cardinality="0..1" interface="path.to.IA" name="ImplAB" policy="dynamic"/>

在包含 ImplAAImplAB 的包中,XML 组件定义中有这样重要的一行:

<implementation class="path.to.ImplAA"/>
<service>
<provide interface="path.to.IA"/>
</service>

<implementation class="path.to.ImplAB"/>
<service>
<provide interface="path.to.IA"/>
</service>

现在的问题是,当我运行代码时,打印了两次使用 ImplAA 的信息。这是什么原因呢?我怎样才能让它打印正确的实现类?

最佳答案

好吧,您绑定(bind)到 IA ...并且有两个 IA 服务(ImplAA 和 ImplAB)。那么,到底为什么 DS 会为 bindToAA 使用与 bindToAB 不同的服务实例呢?您只声明需要 IA?

两种绑定(bind)方法都需要 0 或 1 个 IA 实例,因此两个服务中的任何一个都符合账单,在这种情况下,最好只采用一个,因为需求者 (SomeClass) 似乎并不关心差异。

不,我脑子里的大问题是,你到底为什么要依赖实例? OSGi 的全部目的是隐藏实例。如果你有依赖需求,那就表达出来,这就是OSGi的方式。

不,如果您只想打印服务,请将基数设置为多个并将服务放入列表中。在这种情况下,您表达了对所有 IA 服务的兴趣。

关于java - 抽象类中的 getClass() 返回随机实现类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17968221/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com