关于java中的方法重载

关于java中的方法重载,java,Java,我在java中经历了方法重载,我在eclipse中尝试下面程序的输出,该程序是 public class OverloadingTest { public static void main(String args[]){ List abc = new ArrayList(); List bcd = new LinkedList(); ConfusingOverloading co = new ConfusingOverloading();

我在java中经历了方法重载,我在eclipse中尝试下面程序的输出,该程序是

public class OverloadingTest {

    public static void main(String args[]){
       List abc = new ArrayList();
       List bcd = new LinkedList();

       ConfusingOverloading co = new ConfusingOverloading();
       co.hasDuplicates(abc); //should call to ArryList overloaded method
       co.hasDuplicates(bcd); //should call to LinkedList overloaded method
    }


}

class ConfusingOverloading{

    public boolean hasDuplicates (List collection){
        System.out.println("overloaded method with Type List ");
        return true;
    }

    public boolean hasDuplicates (ArrayList collection){
        System.out.println("overloaded method with Type ArrayList ");
        return true;
    }


    public boolean hasDuplicates (LinkedList collection){
        System.out.println("overloaded method with Type LinkedList ");
        return true;
    }

}
输出为

Output
overloaded method with Type List
overloaded method with Type List

现在在解释中,它被告知..方法重载是在编译时使用Java中的静态绑定解决的,因此请建议如何通过方法重写来实现相同的问题。

abc
bcd
这两种类型都是
List
,即使使用
子类对其进行初始化也是如此。因此产生了结果

List
这样的基类可以帮助您编写可以与它的任何子类(ArrayList或LinkedList)一起使用的方法。 所以


你可以试试看

co.hasDuplicates((ArrayList)abc);
co.hasDuplicates((LinkedList)bcd);

但是
(ArrayList)abc
可以在abc属于
LinkedList
类型时抛出强制转换异常。您可以使用
instanceof
操作符检查abc是否属于
ArrayList
类型,然后强制转换它。

在这种特殊情况下,如果hasdeplicates的意思是它所说的,我将有一个方法以List作为参数。它只需创建一个用列表内容初始化的哈希集,并将其大小与列表大小进行比较

如果您确实需要特殊的案例代码,例如ArrayList,您可以在列表参数方法中使用instanceof

但是,当您使用一种接口类型时,最好找到适用于该接口的所有实现的通用方法。如果不能这样做,则必须允许传递实现接口的类的对象,但该类不是具有特殊案例代码的类之一。如果您需要java.util.ArrayList的特殊案例代码,为什么不需要Arrays.asList用于其结果的私有类实例的特殊案例代码呢

当问题发生在您自己的代码中的不同类时,您通常可以将问题扭转过来,并将方法放在当前的参数类中,这样传统的重写就可以工作了

co.hasDuplicates((ArrayList)abc);
co.hasDuplicates((LinkedList)bcd);