Daha önce belirtildiği gibi, aşırı yükleme çözümlemesi derleme zamanında gerçekleştirilir.
Java Puzzlers'ın bunun için güzel bir örneği var:
Bulmaca 46: Kafa Karıştıran Yapıcı Vakası
Bu bulmaca size iki Kafa karıştırıcı kurucu sunar. Ana yöntem bir kurucu çağırır, ama hangisi? Programın çıktısı cevaba bağlıdır. Program neyi yazdırıyor ya da yasal mı?
public class Confusing {
private Confusing(Object o) {
System.out.println("Object");
}
private Confusing(double[] dArray) {
System.out.println("double array");
}
public static void main(String[] args) {
new Confusing(null);
}
}
Çözüm 46: Kafa Karıştıran Yapıcı Örneği
... Java'nın aşırı yük çözümleme süreci iki aşamada çalışır. İlk aşama, erişilebilir ve uygulanabilir tüm yöntemleri veya yapıcıları seçer. İkinci aşama , ilk aşamada seçilen yöntemlerin veya kurucuların en spesifikini seçer . Bir yöntem veya kurucu, diğerine geçirilen parametreleri kabul edebiliyorsa, diğerine göre daha az spesifiktir [JLS 15.12.2.5].
Programımızda her iki kurucu da erişilebilir ve uygulanabilirdir. Yapıcı
Confusing (Object) , Confusing'e (double []) iletilen herhangi bir parametreyi kabul eder , bu nedenle
Confusing (Object) daha az spesifiktir. (Her çift dizi bir Nesnedir , ancak her Nesne bir çift dizi değildir .) Bu nedenle, en spesifik kurucu, programın çıktısını açıklayan Karmaşıktır (çift []) .
Double [] türünde bir değer iletirseniz bu davranış mantıklıdır ; null geçerseniz mantık dışıdır . Bu bulmacayı anlamanın anahtarı, hangi yöntemin veya kurucunun en spesifik olduğu testin gerçek parametreleri kullanmamasıdır : çağrıda görünen parametreler. Yalnızca hangi aşırı yüklemelerin uygulanabilir olduğunu belirlemek için kullanılırlar. Derleyici, hangi aşırı yüklemelerin uygulanabilir ve erişilebilir olduğunu belirledikten sonra, yalnızca biçimsel parametreleri kullanarak en spesifik aşırı yüklemeyi seçer: bildirimde görünen parametreler.
Confusing (Object) yapıcısını null parametresiyle çağırmak için yeni Confusing ((Object) null) yazın . Bu, yalnızca Kafa Karıştıran (Nesne) seçeneğinin geçerli olmasını sağlar . Daha genel olarak, derleyiciyi belirli bir aşırı yüklemeyi seçmeye zorlamak için, gerçek parametreleri resmi parametrelerin bildirilen türlerine çevirin.