关于java中的方法重载
我在java中经历了方法重载,我在eclipse中尝试下面程序的输出,该程序是关于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();
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);