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}}方法。这种行为会导致任何看不见的问题吗
# 1 楼答案
它不应该引起任何问题,因为子类型意味着一种“IS-a”关系。使用
getFancyComponent()
的任何地方都可以,因为Child
是一个Parent
但是,如果文档没有明确说明
getFancyComponent()
将返回一个子类,或者如果您认为这个方法将来可能会更改以返回一个非子父类,那么我就不去管它了另一种方法是创建另一个名为
getChildFancyComponent()
的方法,用于专门返回子对象# 2 楼答案
你会觉得不舒服,因为你想要做出的改变基本上是不可逆转的
现在可以很容易地用
Child
替换返回类型Parent
,因为每个Child
也都是Parent
但是,您将无法通过再次将
Child
替换为Parent
来恢复这一点,因为Parent
不一定是Child
。如果你突然发现你想要的是Child2
而不是Child
,那么你也无法将返回类型更改为扩展Parent
的Child2
如果您将其更改为
Child
,那么无论Child
签名中有什么抽象泄漏到外部,您都将无法更改它,除非您破坏依赖它的代码你确定你想要返回具有不可思议的继承层次结构的类,而不是一个小的精简接口吗?也许现在用一个极简界面来代替
Parent
还不算太晚,同时又不会破坏太多。现在这将更加困难,但从长远来看,这将更容易处理。如果简单地用Child
子类替换Parent
,那么现在可能会比较舒服,但这样一来,代码库中的熵就不可逆转地增加了这并不意味着你永远不应该改变任何事情,这当然不是我想在这里表达的。但是,您应该知道后果,如果您决定将返回类型从
Parent
更改为Child
,请确保Child
不会泄漏任何严格不必要的内容。也就是说,如果Parent
是一个单一的方法抽象类,那么绝对不应该用一个Child
来替换它,它从其他十个超类继承了二十个方法