Java 代码复制vs类型转换vs?
假设我有这样的课程:Java 代码复制vs类型转换vs?,java,Java,假设我有这样的课程: 家长,孩子1,孩子2…孩子 父母B、子女B1、子女B2……子女BN 因此,每个ChildAi类都扩展了ParentA,每个ChildBi类都扩展了ParentB类 在课堂上,我需要和孩子们一起工作。例如: public class ChildAi extends ParentA{ public ChildBi getChildB(...){ ....some logic.... return childBi; } } 所以问题在于getChildB方
家长,孩子1,孩子2…孩子
父母B、子女B1、子女B2……子女BN
因此,每个ChildAi类都扩展了ParentA,每个ChildBi类都扩展了ParentB类 在课堂上,我需要和孩子们一起工作。例如:
public class ChildAi extends ParentA{
public ChildBi getChildB(...){
....some logic....
return childBi;
}
}
所以问题在于getChildB方法。如果我把这个方法放在ParentA中,那么我只能返回ParentB类,并且我将始终需要执行强制转换。如果我把这个方法放在ChildAi中,我会一直复制这个方法,至少复制它的一些逻辑。我怎样才能解决它?没有泛型就可以解决这样的问题吗?我认为泛型是你在这里的朋友 定义类ParentA如下:
public class ParentA<T extends {
public abstract T getB();
}
public-class-ParentAMaybe可以帮助您。是什么让您不希望使用泛型的呢?好吧,您自己已经说明了一些解决方案:显式强制转换或“复制”代码。请注意,Java中的泛型无论如何都是基于隐式转换的。您知道Java允许协变返回,对吗?因此,您可以在ParentA
中声明public ParentB getChildB(…)
,然后每个ChildAi
类都可以返回它想要的ParentB
的子类型。为什么这还不够?是否需要将每个对象向下投射到ParentB
的相应子对象?为什么?如果它们没有一个可以在ParentB
或某些接口中定义的通用API,那么它们真的是子类型吗?这是否违反了LSP?@David Conrad问题是,在得到ChildB后,我需要ChildB的所有逻辑,而不仅仅是ParentB.OP的逻辑要求不使用泛型的解决方案。@E_net4,我不能同意你的意见。OP正在寻找解决方案,并且没有(或者至少没有提供)任何反对泛型的理由。我想这些理由其实并不存在。这是java风格的解决方案。我能想象的其他解决方案需要强制转换。请注意,我还想知道为什么OP不接受使用泛型。没有理由这样做并不会使他的原始请求完全无效。在这种情况下,你的回答应该考虑到一些动机或理由,说明为什么泛型是唯一合理的选择,而不是像回答问题的这一部分不存在一样。@E_net4我同意你的看法。亚历克斯,你回答了问题的第一部分(如何解决)。非常感谢你。但是你没有证明泛型是唯一的方法。
public class ChildA1 extends ParentA<ChildB1> {
public ChildB1 getB() { return ...;}
}