鉴于这些类:
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)
提前致谢.
不,确实不存在,因为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
接口设计的代码。
归档时间: |
|
查看次数: |
252 次 |
最近记录: |