对于重载的方法选择是静态的(而对于被覆盖的方法的选择是动态的),要调用哪个重载方法是在编译时做出决定的。看下面这个例子:
public class 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));
}
}
我们希望打印出Set,List,UnKoownCollection可结果却是三个UnKoownCollection。这正是应为重载方法是静态选择的原因。所以胡乱使用重载,有可能出现与预想不同的结果。
总而言之,对于具有相同参数个数的方法来说,应该慎用重载。重载的时候应该避免重载参数类型上有联系。