java - 子类作为父类的返回类型
问题描述
在Test
类Object
中与show
方法一起使用。如果我们Object
用类的show
方法来写xyz
,那么会出错。我在这里很困惑 Object 是所有类的父类。可以在任何地方使用。
class Test{
Object show(){
System.out.println("1");
}
}
class xyz extends Test{
String show(){
System.out.println("2");
}
}
如果我把上面的代码写成
class Test{
String show(){
System.out.println("1");
}
}
class xyz extends Test{
Object show(){
System.out.println("2");
}
}
如果 Object 包含所有类或 Object 是parent
所有类的类,那么我们在哪里使用它有关系吗?
解决方案
从 Java 5 开始,方法覆盖允许协变返回类型,这意味着子类的覆盖方法可以返回更具体但仍可分配给父方法返回类型的类型。
在这种情况下,由于父方法正在返回Object
,子方法实际上可以返回String
一个子类,Object
并且可以分配给它。
从JLS 规格:
如果返回类型是引用类型,则返回类型可能会因相互覆盖的方法而异。return-type-substitutability 的概念支持协变返回,即将返回类型特化为子类型。
如果你CharSequence
在父类方法中尝试这个并在子类方法中说一个Integer
它不会编译:
class Test{
CharSequence show(){
System.out.println("1");
return null;
}
}
class xyz extends Test{
Integer show(){ //won't compile
System.out.println("2");
return null;
}
}
但是用它替换Integer
它String
会编译为String
implements / 是一种CharSequence
:
class Test{
CharSequence show(){
System.out.println("1");
return null;
}
}
class xyz extends Test{
String show(){
System.out.println("2");
return null;
}
}
推荐阅读
- java - 如何找到我的数据库 url 以连接到 postgres?
- python - TypeError:元组索引必须是整数或切片,而不是 str scipy.optimize
- android - Android JSON 数组计数
- javascript - 使用 Winston Logger 登录 /var/log 失败
- scala - 荷兰国旗问题的惯用 Scala 解决方案
- twitter - 使用 twitter 应用程序登录时未执行 TWTRLogInCompletion 块
- google-cloud-platform - 如何在 GCP 上的 Dataproc 集群上安装 presto-admin?
- google-play - 使用 anjlab 中的 BillingProcessor 时 Google Play 中的安全性
- php - 执行“GetObjectAcl”时出错导致 403 Forbidden Access Denied
- python - R 或 Python 中的分层数据列表数据整理