【问题标题】:Alternative ways to cast an interface to its implementation将接口转换为实现的替代方法
【发布时间】:2014-12-10 10:08:51
【问题描述】:

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

public interface ITest {
}

public TestClass implements ITest {
}

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

public void pass(ITest testObject) {
    //
}

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

我希望像testObject.getImplementation() 这样的东西返回一个TestClass 实例当且仅当testObject 是一个instanceofTestClass (如果ITest 也是任何其他实现)。

【问题讨论】:

  • 您为什么要想要投射到TestClass?如果你在你的方法中事先不知道这个类,你想用它做什么?我怀疑如果你进一步思考你正在尝试做什么,你会发现其他问题。
  • 如果你想投,那你为什么要使用界面呢?

标签: java types interface casting


【解决方案1】:

您可以使用Visitor pattern,但我怀疑您最好还是研究一下您的设计。也许ITest 应该暴露一个方法?

【讨论】:

    【解决方案2】:

    您的设计有问题。如果您需要进行演员表,您的界面似乎过于通用。

    最好的方法是在接口中添加一个新方法:例如isOK()。 每个实现都会在 isOK() 方法中进行自检。

    代码会变成

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

    所以不再需要演员表了。

    【讨论】:

      【解决方案3】:

      您可以使用 Object 的 getClass 方法,您将获得实现类。

      【讨论】:

        猜你喜欢
        • 2019-07-26
        • 2019-05-08
        • 2020-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 1970-01-01
        相关资源
        最近更新 更多