代码之家  ›  专栏  ›  技术社区  ›  Håvard S

向下强制转换(即强制转换为派生类型)是否总是错误的?[关闭]

oop
  •  5
  • Håvard S  · 技术社区  · 15 年前

    你对下压的看法是什么?它是否总是错误的,或者在某些情况下,它是可接受的,甚至是可取的或期望的?

    有没有什么好的衡量标准/指导方针可以告诉我们什么时候下压是“邪恶的”,什么时候下压是“好的”/“好的”?

    (我知道 a similar question exists 但这个问题是从一个具体的案例中得出的。我想从总体设计的角度来回答。)

    3 回复  |  直到 13 年前
        1
  •  8
  •   Jon Skeet    15 年前

    不,绝对不是 总是 错了。

    例如,假设在C中有一个事件处理程序,它得到 sender 参数,表示事件的发起方。现在您可以将该事件处理程序连接到几个按钮,但您知道它们是 总是 按钮。铸造是合理的 发件人 Button 在那个代码中。

    这只是一个例子——还有很多其他的例子。有时它只是一种绕过稍微笨拙的API的方法,有时它是由于无法在正常类型系统中清晰地表达类型而产生的。例如,您可能有 Dictionary<Type, object> 适当封装,使用通用方法添加和检索值-其中条目的值是键的类型。演员表在这里是完全自然的-你可以看到它总是有效的,它给系统的其他部分提供了更多的类型安全性。

        2
  •  3
  •   Michael Borgwardt    15 年前

    这永远不是一个理想的解决方案,应该尽可能避免——除非选择会更糟。有时,这是无法避免的,例如,前泛型Java的标准API库有很多类(最显著的是集合),它们需要向下转换是有用的。有时,改变设计以避免向下投射会显著地使其复杂化,因此向下投射是更好的解决方案。

        3
  •  1
  •   Péter Török    15 年前

    “合法”下注的一个例子是Java Prime5,当访问它们时,必须将容器元素向下压到它们的具体类型。在那种情况下是不可避免的。这也显示了问题的另一方面:如果在给定的情况下你需要大量的贬低,那么它开始是邪恶的,所以最好在没有贬低的情况下找到另一个解决方案。这导致了Java 5中泛型的引入。

    约翰·弗拉西德斯在他的优秀著作中对这个问题(又称“类型清洗”)进行了大量的分析。 Pattern Hatching (实际上是 Design Patterns )