当重写方法时,我返回类型是超级方法返回类型的子类型。
但是为什么我不能对方法参数列表做同样的事情。
例如
public class OverrideTest implements CustomersI {
@Override
public ArrayList<Customer> getCustomers(ArrayList<String> names) {
// TODO Auto-generated method stub
return null;
}
}
interface CustomersI{
List<Customer> getCustomers(List<String> names);
}
class Customer{
Customer(String name){
}
}
为什么我可以更改返回类型ArrayList而不是List,为什么不能对参数列表做同样的事情。
最佳答案
我们可以使用超级类型声明变量并初始化为子类型。
CustomersI customers = new OverrideTest();
但是在运行时,实际对象
OverrideTest()
在起作用。当您根据界面将参数传递给
customers.getCustomers(..)
时,它允许使用List的任何子类型。但是实际对象(OverrideTest
)仅允许ArrayList
或其子类型。对于前。假设您要传递
LinkedList<Customer>
的对象。现在,您的OverrideTest类中的getCustomers不允许传递此对象。因此,您的实现是错误的。因此,您不能使用子类型作为参数,但是可以使用晚饭类型。