Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 代码复制vs类型转换vs?_Java - Fatal编程技术网

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 ...;}
}