有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将常用方法的返回类型修改为其子类型

在当前项目中,我们使用一个通用模块。我已经将一个方法的返回类型更改为它的子类型。这不是破坏建筑或任何东西,但不知何故,我觉得不舒服。让我举个例子

class Child extends Parent{
    ...
}

在另一个文件中,比如组件

public static Parent getFancyComponent(){
    return new Child();
}

不知何故,有人将返回类型设为Parent,即使创建的对象的类型是Child。到目前为止没有问题。但另一个人创造了这样的方法

public static getFancyColumn(Child child,String name){
    ...
}

现在,如果我想在这里使用getFancyComponent方法,我必须强制转换类型

getFancyColumn((Child)getFancyComponent(), "fancy"); 

在这里转换了这个类型之后,我决定将getFancyComponent方法的返回类型更改为Child。我想听听你的想法。并考虑到至少有数百种用法使用这个{{CD4}}方法。这种行为会导致任何看不见的问题吗


共 (2) 个答案

  1. # 1 楼答案

    它不应该引起任何问题,因为子类型意味着一种“IS-a”关系。使用getFancyComponent()的任何地方都可以,因为Child是一个Parent

    但是,如果文档没有明确说明getFancyComponent()将返回一个子类,或者如果您认为这个方法将来可能会更改以返回一个非子父类,那么我就不去管它了

    另一种方法是创建另一个名为getChildFancyComponent()的方法,用于专门返回子对象

  2. # 2 楼答案

    你会觉得不舒服,因为你想要做出的改变基本上是不可逆转的

    现在可以很容易地用Child替换返回类型Parent,因为每个Child也都是Parent

    但是,您将无法通过再次将Child替换为Parent来恢复这一点,因为Parent不一定是Child。如果你突然发现你想要的是Child2而不是Child,那么你也无法将返回类型更改为扩展ParentChild2

    如果您将其更改为Child,那么无论Child签名中有什么抽象泄漏到外部,您都将无法更改它,除非您破坏依赖它的代码

    你确定你想要返回具有不可思议的继承层次结构的类,而不是一个小的精简接口吗?也许现在用一个极简界面来代替Parent还不算太晚,同时又不会破坏太多。现在这将更加困难,但从长远来看,这将更容易处理。如果简单地用Child子类替换Parent,那么现在可能会比较舒服,但这样一来,代码库中的熵就不可逆转地增加了

    这并不意味着你永远不应该改变任何事情,这当然不是我想在这里表达的。但是,您应该知道后果,如果您决定将返回类型从Parent更改为Child,请确保Child不会泄漏任何严格不必要的内容。也就是说,如果Parent是一个单一的方法抽象类,那么绝对不应该用一个Child来替换它,它从其他十个超类继承了二十个方法