是否可以将未知对象强制转换为特定接口?

时间:2019-02-18 13:55:36

标签: java casting

更新:让我在这里添加一个复杂的内容。假设createObject()返回实际上实现2个接口的Object-SomeInterfaceAnotherInterface。为了使用Object,调用者必须将其类型转换为接口之一。在这种情况下,下面的代码片段可以吗?


我有一个“工厂方法”,该方法在内部创建某种“未知”类型的对象,并仅返回一个“对象”。该工厂方法的文档(例如createObject())明确指出,由此创建/返回的对象将实现特定的接口(例如SomeInterface)。所以我有一个代码片段,如下所示:

SomeInterface intf = (SomeInterface) createObject();

如果(例如)createObject()返回了未实现Object的{​​{1}},这会导致运行时异常,我可以接受。但是Java专家说此代码“错”了-原因(根据他的说法)是SomeInterface必须返回createObject()

我不太相信,并愿意向这里的社区学习。

2 个答案:

答案 0 :(得分:0)

Maven正确地说-工厂方法不好。但是假设问题是由外部代码(您无法更改)引起的,则只有3种解决方法:

  • 添加样板代码以使Maven平静下来
  • 仅对此代码段添加一些抑制警告注释/标记(如果可能)
  • 重新配置Maven使其忽略(不推荐!)
  • 或者只是忍受...

每种解决方案的利弊都非常明确-您必须做出选择:)

答案 1 :(得分:0)

由于这不是编译器错误,因此我假设mave运行代码样式检查器。 在强制转换之前,通过检查创建的对象是否是接口的实例来更正“错误”。

SomeInterface intf = null;
{
    Object obj = createObject();
    if (obj instanceof SomeInterface) {
        intf = (SomeInterface) createObject();
    }
}

由于对象可以为null,所以null永远不会是SomeInterface,因此我给出了一些环境代码。尽可能适应您的需求。