不同类型集合的集合重载

Collection overloading for different types of collections

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

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));
    }
    }
}

当我 运行 这段代码片段每次我得到输出 "Collection" 这意味着调用了参数为 Collection 的分类方法。

请说明

如您所说,重载方法的链接是在编译时进行的。 当您遍历 Collection 的列表时,编译器只知道当前元素是 Collection 的实例,因此它链接到 classify(Collection) 方法,然后总是调用该方法。

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

在编译时,编译器发现 collectionsCollection 的数组,因此绑定到 classifypublic static String classify(Collection<?> s) 版本。

编辑:即使这些方法是非静态的,您仍然会发现调用的是 Collection 版本,因为 overloaded methods are bonded using static binding at compile-time while overridden methods are bonded using dynamic binding at runtime

因为 coll 是 Collection 的类型,所以每次调用 classify(Collection s) methed.if 你想调用其他方法,你需要转换 type.Here 是代码:

Collection<?>[] collections = { new HashSet<String>(),new ArrayList<String>(), new HashMap<String, String>().values() };
for (Collection<?> coll : collections) {
    if(coll instanceof Set<?>){
        System.out.println(classify((Set<?>)coll));
    }
    else if(coll instanceof List<?>) {
        System.out.println(classify((List<?>)coll));
    }
    else {
        System.out.println(classify((Collection<?>)coll));
    }
}