Java覆盖提示

Java覆盖提示,java,polymorphism,overriding,Java,Polymorphism,Overriding,重写方法i时,返回类型为超级方法返回类型的子类型。 但是为什么我不能用方法参数列表做同样的事情呢 前 public类重写测试实现CustomersI{ @凌驾 公共ArrayList getCustomers(ArrayList名称){ //TODO自动生成的方法存根 返回null; } } 接口客户{ 列出客户(列出姓名); } 类客户{ 客户(字符串名称){ } } 为什么我可以更改返回类型ArrayList而不是List,并且不能对param List执行相同操作 因为您不尊重接口的契

重写方法i时,返回类型为超级方法返回类型的子类型。 但是为什么我不能用方法参数列表做同样的事情呢

public类重写测试实现CustomersI{
@凌驾
公共ArrayList getCustomers(ArrayList名称){
//TODO自动生成的方法存根
返回null;
}
}
接口客户{
列出客户(列出姓名);
}
类客户{
客户(字符串名称){
}
}
  • 为什么我可以更改返回类型ArrayList而不是List,并且不能对param List执行相同操作
      因为您不尊重接口的契约。接口方法说:任何人都可以用任何类型的
      列表给我打电话。该类实现了这个接口,bu说:任何人都可以调用我,但不能使用任何类型的
      列表
      :仅
      数组列表
      。因此,这是无效的,因为该方法没有实现接口中声明的契约


      返回更具体的类型没有这个问题。接口方法说:如果你打电话给我,你会得到一个
      列表。class方法说:如果你打电话给我,你会得到一个列表,我甚至可以更精确地说:你会得到一个
      ArrayList
      ,这是一个
      列表,因为你不尊重接口的契约。接口方法说:任何人都可以用任何类型的
      列表给我打电话。该类实现了这个接口,bu说:任何人都可以调用我,但不能使用任何类型的
      列表
      :仅
      数组列表
      。因此,这是无效的,因为该方法没有实现接口中声明的契约


      返回更具体的类型没有这个问题。接口方法说:如果你打电话给我,你会得到一个
      列表。class方法说:如果你打电话给我,你会得到一个列表,我甚至可以更精确地说:你会得到一个
      ArrayList
      ,这是一个
      列表,因为你不尊重接口的契约。接口方法说:任何人都可以用任何类型的
      列表给我打电话。该类实现了这个接口,bu说:任何人都可以调用我,但不能使用任何类型的
      列表
      :仅
      数组列表
      。因此,这是无效的,因为该方法没有实现接口中声明的契约


      返回更具体的类型没有这个问题。接口方法说:如果你打电话给我,你会得到一个
      列表。class方法说:如果你打电话给我,你会得到一个列表,我甚至可以更精确地说:你会得到一个
      ArrayList
      ,这是一个
      列表,因为你不尊重接口的契约。接口方法说:任何人都可以用任何类型的
      列表给我打电话。该类实现了这个接口,bu说:任何人都可以调用我,但不能使用任何类型的
      列表
      :仅
      数组列表
      。因此,这是无效的,因为该方法没有实现接口中声明的契约


      返回更具体的类型没有这个问题。接口方法说:如果你打电话给我,你会得到一个
      列表。类方法说:如果你调用我,你会得到一个列表,我甚至可以更精确地说:你会得到一个
      ArrayList
      ,这是一个
      List

      ,因为如果参数列表被更改,函数签名是不同的。对于重写,函数签名必须保持不变,因为调用函数时函数签名是匹配的。 相同的思想允许函数重载,其中被调用函数由参数决定,而函数签名则由参数决定


      希望这对您有所帮助,因为如果参数列表发生更改,函数签名会有所不同。对于重写,函数签名必须保持不变,因为调用函数时函数签名是匹配的。 相同的思想允许函数重载,其中被调用函数由参数决定,而函数签名则由参数决定


      希望这对您有所帮助,因为如果参数列表发生更改,函数签名会有所不同。对于重写,函数签名必须保持不变,因为调用函数时函数签名是匹配的。 相同的思想允许函数重载,其中被调用函数由参数决定,而函数签名则由参数决定


      希望这对您有所帮助,因为如果参数列表发生更改,函数签名会有所不同。对于重写,函数签名必须保持不变,因为调用函数时函数签名是匹配的。 相同的思想允许函数重载,其中被调用函数由参数决定,而函数签名则由参数决定


      希望这有助于

      我们可以使用超级类型声明变量并初始化为子类型

      CustomersI customers = new OverrideTest();
      
      但在运行时,实际对象
      OverrideTest()
      正在运行

      当您根据界面将参数传递给
      customers.getCustomers(..)
      时,它允许列表的任何子类型。但实际对象(
      OverrideTest
      )仅允许
      ArrayList
      或其子类型。 例如,假设您要传递
      LinkedList
      的对象。现在,不允许OverrideTest类中的getCustomers传递此对象。因此,您的实现是错误的


      所以,不能使用子类型作为参数,但可以使用super类型。

      我们可以使用super类型声明变量并初始化为子类型

      CustomersI customers = new OverrideTest();
      
      但在运行时,实际对象
      OverrideTest()
      正在运行

      当您根据界面将参数传递给
      customers.getCustomers(..)
      时,它允许列表的任何子类型。但实际对象(
      OverrideTest
      // class Object
      protected native Object clone() throws CloneNotSupportedException;
      
      // class Customer
      @Override
      protected Customer clone() throws CloneNotSupportedException {
          ...
      }