1.由于重載調(diào)用哪個方法是在編譯時做出的決定漫仆,所以很容易造成調(diào)用了出乎意料重載方法的情況衡奥,比如以下例子笨蚁,它最后輸出了三個Unkown Collection铝噩。
public class CollectionClassifier {
public static String classify(Set<?> s) {
return "Set";
}
public static String classify(List<?> lst) {
return "List";
}
public static String classify(Collection<?> c) {
return "Unknown Collection";
}
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));
}
}
2.重寫方法是在運行時決定調(diào)用哪個方法,所以編譯時的類型不會影響最終調(diào)用哪個方法泪喊。
3.最安全的方式是不要導(dǎo)出兩個參數(shù)數(shù)量相同的重載方法棕硫。如果用了可變參數(shù),那就不要重載它袒啼。只要取個不一樣的名字就可以避免重載的麻煩.
4.對于構(gòu)造器可以用靜態(tài)工廠代替哈扮。
5.自動裝箱可能導(dǎo)致調(diào)用錯重載方法纬纪。
public class SetList {
public static void main(String[] args) {
Set<Integer> set = new TreeSet<>();
List<Integer> list = new ArrayList<>();
for (int i = -3; i < 3; i++) {
set.add(i);
list.add(i);
}
for (int i = 0; i < 3; i++) {
set.remove(i);
list.remove(i);
}
System.out.println(set + " " + list);
}
}
以上代碼最后輸出為 [-3,-2滑肉,-1] [-2包各,0,2] 靶庙, 主要原因是list.remove(i)調(diào)用選擇重載方法remvoe(int i)问畅,它從列表的指定位置上去除元素。它沒有按預(yù)期自動裝箱后調(diào)用 remvoe(Integer i)六荒。
6.不要再相同參數(shù)位置調(diào)用不同函數(shù)接口的方法护姆。
思考;
1.相同參數(shù)數(shù)量的重載方法應(yīng)當避免,一方面不確定使用時是否能調(diào)用預(yù)期方法掏击。另一方面可讀性也會變差卵皂,看到一個方法調(diào)用還要甄別是哪個重載方法。在寫方法時砚亭,需要注意避免同名方法灯变,一種方式是先寫調(diào)用,后生成方法捅膘,IDE會提示是否已經(jīng)有這個方法名的方法了柒凉,還有就是在調(diào)用方法時,要注意是否有同名方法篓跛,如果有膝捞,需要查看是否需要重命名后去除重載。