2

我正在通过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中的静态绑定解决的,所以请告知我如何通过方法覆盖来实现相同的目标。

4

2 回答 2

1

abc,即使您使用 . 对其进行初始化,bcd两者都是类型,因此结果Listsubclass

BaseClass likeList可以帮助您编写可以与它的任何子类(ArrayList 或 LinkedList)一起使用的方法。所以,

public ArrayListLinkedListCanCallMe(List lst)
{
 //now imagine if this method was called with bcd as parameter
 //still lst would be of type List not LinkedList
 //and if lst were allowed to be of type LinkedList then how could List know any
 //of the methods of LinkedList.Therefore lst would always be of type List NOT LinkedList
}

您可以尝试

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

但是(ArrayList)abc如果 abc 是类型,则可以抛出强制转换异常LinkedList。您可以使用instanceof运算符检查 abc 是否是类型ArrayList,然后将其强制转换..

于 2013-02-10T17:26:41.037 回答
0

在这种特殊情况下,如果 hasDuplicates 意味着它所说的,我将有一种方法以 List 作为参数。它只会创建一个使用 List 内容初始化的 HashSet,并将其大小与 List 大小进行比较。

如果您确实需要特殊情况代码,例如 ArrayList,您可以在 List 参数方法中使用 instanceof。

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

当问题是您自己代码中的不同类时,您通常可以扭转问题并将方法放在当前的参数类中,以便常规覆盖工作。

于 2013-02-10T17:33:43.753 回答