Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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 无法在子类中创建返回类型对象的方法_Java_Oop - Fatal编程技术网

Java 无法在子类中创建返回类型对象的方法

Java 无法在子类中创建返回类型对象的方法,java,oop,Java,Oop,我是一名Java初学者,在学习过程中遇到了这个程序 一班是超级班。第二类扩展一类,第三类扩展二类 class One { public One foo() { return this; } } class Two extends One { public One foo() { return this; } } class Three extends Two { public Two foo() { return this; } } 在第三类中,当我创建返回类型为2

我是一名Java初学者,在学习过程中遇到了这个程序

一班是超级班。第二类扩展一类,第三类扩展二类

class One {
public One foo() {
return this;
}
}
class Two extends One {
  public One foo() {
   return this;
  }
}
class Three extends Two {
  public Two foo() {
   return this;
  }
}
在第三类中,当我创建返回类型为2的方法foo时,没有编译错误,但是当我创建返回类型“Object”时,出现编译错误,如下所示

class Three extends Two {
  public Object foo() {
   return this;
  }
}

据我目前所知,Object是所有类的超类。为什么我不能在子类中创建一个返回类型为“Object”的方法呢?

它失败了,因为返回的类应该是一个
One
或其子类(例如a
Two
),而该子类保证也是
One
;它不是一个超类(如
对象
),就编译器所知,它可以是一个
超类

class Three extends Two {
  public Two foo() { // works because Two is a subclass of One
   return this;
  }
}
但是


如果您对co-variant
返回类型有一个想法,而
重写
的概念出现了,那么您必须知道,在child
类中,重写方法必须
返回
super
类方法包含的类型相同,或者是任何
子类
(共变量类类型)

注意:-在此代码中,您返回的是一个
对象
类。它是所有类的
超级
,而不是子类,因此它是一种用于编译的非法代码

你可以试试这个

class Three extends Two {
  public Two foo() { // works because Two is a subclass of One
   return this;
  }
}


两者都可以。根据您的需要使用。谢谢您

为什么要回滚我所做的编辑?会引入拼写错误、格式错误、噪音等?您知道堆栈溢出是如何工作的,对吗?鼓励每个人改进帖子?
class Three extends Two {
  public Object foo() {
   return this;
  }
}
class Three extends Two {
  public Two foo() { // works because Two is a subclass of One
   return this;
  }
}
class Three extends Two {
      public Three foo() { // works because Three is a subclass of Two & One
       return this;
      }
    }