-1

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


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

SomeInterface intf = (SomeInterface) createObject();

如果(比如说)createObject()返回一个Object未实现的SomeInterface. 但是一个 Java 专家说这段代码是“错误的”——原因(根据他的说法)是,createObject()必须返回SomeInterface

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

4

2 回答 2

0

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

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

由于对象可能为空,而空永远不是 SomeInterface,我给出了一些间接代码。适应最适合您的情况。

于 2019-02-18T14:32:54.940 回答
0

Maven 说得对——工厂方法不是很好。但是假设问题是由外部(您无法更改)代码引起的,您只有 3 条出路:

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

每个解决方案的优缺点都非常清楚 - 你必须做出选择:)

于 2019-02-18T14:23:05.053 回答