1、对象的运行时类型并不影响“哪个重载版本将被执行”,对于重载方法的选择是静态的(而对于被覆盖的方法的选择是动态的),要调用哪个重载方法是在编译时做出决定的。
publicclass CollectionClassifier{
public static String classify(Set <? > s){
return "Set";
}
public static String classify(List <? > lst){
return "List";
}
public static Stringclassify(Collection < ? > c){
return "UnknownCollection";
}
public static void main(String[] args){
Collection < ? >[]collections = {new HashSet < String >(),new ArrayList<BigInteger>(),new HashMap <String,String >().values()};
for(Collection < ? >c:collections)
System.out.println(classify(c));
}
}
对于上例,它将打印“Unknown Collection”三次。对于for循环中的全部三次迭代,虽然每次迭代的运行时类型都是不同的,但参数的编译时类型都是相同的:Collection<?>。
2、应该避免胡乱的使用重载机制
1)安全而保守的策略是,永远不要导出两个具有相同参数数目的重载方法。