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