返回types可以重写的方法有所不同吗?
重写的方法可以有不同的返回types吗?
重写的方法可能有更具体的返回types。 也就是说,只要新的返回types可分配给你重写的方法的返回types,就可以了。
例如:
class ShapeBuilder { ... public Shape build() { .... } class CircleBuilder extends ShapeBuilder{ ... @Override public Circle build() { .... }
这在Java语言规范的第8.4.5节中有规定:
如果返回types是引用types,那么返回types可能会相互覆盖。 返回types可替代性的概念支持协变返回,也就是返回types专门化为子types。
当且仅当以下条件成立时,具有返回typesR1的方法声明d1对于具有返回typesR2的另一方法d2是可返回types可替代的:
如果R1是无效的,则R2是无效的。
如果R1是原始types,则R2与R1相同。
如果R1是一个引用types,那么:
R1是R2的子types,或者R1可以通过非检查转换(§5.1.9)转换为R2的子types,或者
R1 = | R2 |
(“| R2 |”是指JLS 4.6节定义的R2的删除。)
是的,如果他们返回一个子types。 这是一个例子:
package com.sandbox; public class Sandbox { private static class Parent { public ParentReturnType run() { return new ParentReturnType(); } } private static class ParentReturnType { } private static class Child extends Parent { @Override public ChildReturnType run() { return new ChildReturnType(); } } private static class ChildReturnType extends ParentReturnType { } }
这段代码编译并运行。
是的,它可能有所不同,但它们有一些限制。
在Java 5.0之前,当您重写一个方法时,参数和返回types必须完全匹配。 在Java 5.0中,它引入了一个称为协变返回types的新工具。 您可以重写具有相同签名的方法,但会返回返回对象的子类。 换句话说,子类中的方法可以返回一个对象,该对象的types是超类中具有相同签名的方法返回的types的子类。
是的这是可能的..返回types可以不同,只有父类方法返回types是
超types的子类方法返回types..
手段
class ParentClass { public Circle() method1() { return new Cirlce(); } } class ChildClass extends ParentClass { public Square method1() { return new Square(); } } Class Cirlce { } class Square extends Circle { } ---
如果这是不同的返回types可以被允许…
返回types必须与超类中原始重写方法中声明的返回types相同或者是其子types。
重写和返回types以及协变返回
子类必须定义一个精确匹配inheritance版本的方法。 或者,从Java 5起,您可以更改返回types
示例代码
class Alpha { Alpha doStuff(char c) { return new Alpha(); } } class Beta extends Alpha { Beta doStuff(char c) { // legal override in Java 1.5 return new Beta(); } } }
从Java 5开始,这个代码将被编译。 如果你试图用1.4编译器来编译这个代码,编译器会说试图使用不兼容的返回types – sandeep1987 1小时前
一般来说,返回types的覆盖方法可以是不同的。 但是这并不是直截了当的,有一些情况涉及到这一点。
情况1:如果返回types是原始数据types或void。
输出:如果返回types是void或者primitive,那么父类方法和覆盖方法的数据types应该是相同的。 例如,如果返回types是int,float,string,那么它应该是相同的
情况2:如果返回types是派生数据types:
输出:如果父类方法的返回types是派生types,则重写方法的返回types与派生数据types的子类的派生数据types相同。 例如假设我有一个类A B是子类A C是B的子类D是子类C如果超级类返回typesA则重写方法是子类可以返回A,B,C或Dtypes即其子types。 这也被称为协变。
是的,这是可能的
class base { base show(){ System.out.println("base class"); return new base(); } } class sub extends base{ sub show(){ System.out.println("sub class"); return new sub(); } } class inheritance{ public static void main(String []args) { sub obj=new sub(); obj.show(); } }