将接口强制转换为其实现的替代方法

时间:2014-10-15 10:52:35

标签: java types interface casting

假设我有一个接口和实现:

public interface ITest {
}

public TestClass implements ITest {
}

在我的代码中,我有一些方法:

public void pass(ITest testObject) {
    //
}

如果不事先知道我在上述方法中处理的ITest的实现,我该如何转换为TestClass?例如,在上面的方法中,我可以进行演员((TestClass)testObject),但这需要事先了解实现,我希望你假设我没有。 (我知道我可以检查所有instanceof并投射到正确的实现,但我不想这样做。)

我希望testObject.getImplementation()这样的内容返回TestClass个实例当且仅当testObjectinstanceofTestClass时(以及任何其他实现,如果ITest)。

3 个答案:

答案 0 :(得分:0)

您可以使用对象的getClass方法,然后您将获得实施课程。

答案 1 :(得分:0)

你的设计出了问题。如果你需要进行强制转换,那么你的界面似乎太通用了。

最好的方法是在界面中添加新方法:例如 isOK()。每个实现都会在 isOK()方法中自行检查。

代码将变为

public void pass(ITest testObject) {
    if (testObject.isOk()) {...}
}

因此不再需要施法。

答案 2 :(得分:0)

你可以使用Visitor pattern,但我更怀疑你最好不要去研究你的设计。也许WebServiceTemplate应该公开一个方法?