java继承

Seb*_*eby 5 java inheritance

鉴于这些类:

class Father {
  public Father getMe() {
    return this;
  }
}

class Child extends Father { .. }
Run Code Online (Sandbox Code Playgroud)

我从Child类调用了父类的公共方法:

Child c = new Child();
Child c1 = c.getMe();
Run Code Online (Sandbox Code Playgroud)

所以,这不起作用,我必须使用强制转换使其工作:

Child c1 = (Child) c.getMe();
Run Code Online (Sandbox Code Playgroud)

问题是:有没有更好的方法让它在没有演员的情况下工作?可以这样吗?:

public <T extends Father> T getMe() {
  return this;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Chr*_*son 2

不,确实不存在,因为Child是 的子类Father,而不是相反。如果你有

public Child getMe();
Run Code Online (Sandbox Code Playgroud)

你可以做

Father father = c.getMe();
Run Code Online (Sandbox Code Playgroud)

没有问题,因为您可以隐式转换为超类型,但不能以相反的方式执行此操作。基本上,这样想。就您而言,每个孩子都是父亲,但并非每个父亲都是孩子。您的第二个解决方案将起作用,尽管您必须将泛型类型声明为 type Child,这使得它不再是关于继承的问题,而是更多关于泛型的问题。

最终,正如一位评论者所说,如果您确实需要确切地知道实例是什么类型,那么您可能做错了什么。继承的真正好处是能够解耦代码片段。客户端代码并不关心实际的实现是什么,它只知道需要调用什么方法来完成某些事情。诚然,在某些情况下您确实需要强制转换对象,因为您确实需要确切地知道它是什么类型,但这应该很少发生。在这种情况下,值将是定义一个方法,该方法将Father对象作为参数并了解如何使用该Father接口。它需要的所有方法都将被定义为Father类的一部分。其他代码可以创建自定义子类,Father这将允许它们扩展类的功能,同时仍然允许它们使用围绕Father接口设计的代码。