不同类型集合的集合重载

Sci*_*ist 2 java collections overloading

我知道重载是在编译时决定的,但是当我尝试运行下面的示例时,它给出的结果是我无法理解的

package miscellaneous;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class CollectionsOverloading {

public static String classify(Set<?> s) {
    return "Set";
}

public static String classify(List<?> s) {
    return "List";
}

public static String classify(Collection<?> s) {
    return "Collection";
}

public static void main (String args[]) {

    Collection<?>[] collections = { new HashSet<String>(), new ArrayList<String>(), new HashMap<String, String>().values()};

    for (Collection<?> coll : collections) {
        System.out.println(classify(coll));
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我每次运行此代码片段时,我都会得到“Collection”输出,这意味着调用了参数为 Collection 的分类方法。

请解释

tuc*_*uxi 5

由于classify您调用的方法是静态的,因此您需要在编译时而不是运行时选择要调用的方法。

在编译时,编译器认为collections是 的数组Collection,因此绑定到 的public static String classify(Collection<?> s)版本classify

编辑:即使这些方法是非静态的,您仍然会找到Collection被调用的版本,因为重载方法在编译时使用静态绑定进行绑定,而重写方法在运行时使用动态绑定进行绑定