不同类型集合的集合重载
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
方法是静态的,因此您选择在编译时调用哪个方法,而不是在 运行 时。
在编译时,编译器发现 collections
是 Collection
的数组,因此绑定到 classify
的 public 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));
}
}
我知道重载是在编译时决定的,但是当我尝试 运行 下面的示例时,它给出了我无法理解的结果
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
方法是静态的,因此您选择在编译时调用哪个方法,而不是在 运行 时。
在编译时,编译器发现 collections
是 Collection
的数组,因此绑定到 classify
的 public 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));
}
}