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

例如

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不允许传递此对象。因此,您的实现是错误的。

因此,您不能使用子类型作为参数,但是可以使用晚饭类型。

07-24 09:20