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 的分类方法。
请解释
由于classify您调用的方法是静态的,因此您需要在编译时而不是运行时选择要调用的方法。
在编译时,编译器认为collections是 的数组Collection,因此绑定到 的public static String classify(Collection<?> s)版本classify。
编辑:即使这些方法是非静态的,您仍然会找到Collection被调用的版本,因为重载方法在编译时使用静态绑定进行绑定,而重写方法在运行时使用动态绑定进行绑定。
| 归档时间: |
|
| 查看次数: |
1223 次 |
| 最近记录: |