2012-09-15 20 views
12

Bir süper sınıfın yöntemini geçersiz kıldığınızda, Java dönüş türünün eşdeğişken olmasına izin verir.Java'daki contravariant parametre türlerinin neden geçersiz kılınmasına izin verilmiyor?

Kontrastsız parametre türleri, aksi halde, geçersiz kılma yöntemleri kullanıldığında değil izin verilir?

+4

olası yinelemesi [Neden geçersiz kılma için hiçbir parametre varyasyonu yok?] (Http://stackoverflow.com/questions/2995926/why-is-there-no-parameter-contra-variance-for-overriding) –

+0

Teşekkürler. Bunu gördüm, fakat C++ ile cevabı anlamakta zorluk çektim, çünkü C++ ile tamamen tanımadım. Özellikle Java'yı sormak daha kolay olabileceğini düşündüm. – Will

+0

Bağlantılı gönderiyi okudum ve anladığım kadarıyla bu özellikten elde edilen kazanım, artan sürpriz faktörüne ağır basmıyor. Ve belirli bir uygulama için aşırı yüklenmiş bir yöntem sağlamak zor değil. Yani bu özellik için başka hangi kullanım durumlarını görüyorsunuz? Doğrudan sınıfta arama yöntemi dışında? –

cevap

15

Bu, overloading olarak adlandırıldı. Özellikle, aşırı yükleme yaparken dikkate alınmadığı için döner tip türü eşdeğişken olabilir ve bu nedenle yine de üst sınıfın veya arabirimin uygulanmasına uyuyordur. Aşırı yüklenirken parametreler dikkate alınır. Number doSomethingWithNumber(Integer value) ile Number doSomethingWithNumber(Number value) ile karşılaştırıldığında bir optimizasyonunuz olabilir.

+0

Tersine değişken parametrelere sahip olduğunu varsayarsak, yine de karşılaşacağımız sorunlar nelerdir? Şunun gibi bir şey arıyorum: http://stackoverflow.com/a/2996901/715236, ancak bir üst sınıfta birden fazla üst üste binen bir alt sınıfta yöntem üzerinde sahip olmak ne kötü olurdu? – Will

+0

En büyük sorun, zincirde herhangi bir yer tipi aşırı yük verildiğinde aşırı yüklerin sağlanamaması olabilir. Bu, polimorfik işlev çağrıları ile hasara yol açabilir, çünkü arama basit bir eşit imzayı, eşit ya da daha fazla temel imzayı değiştirmek zorunda kalacaktır ve her ikisine birden sahipseniz, ancak daha spesifik olanı çağırmanız gerekirse ne demelisiniz? Bir tasarım perspektifinden, eğer 'A' B 'yi uzatırsa ve' B 'C' yi uzatırsa, fakat 'B' bağlantınızdaki 'void f (Object o)' uygulamasını sağlarsa, o zaman 'A'nın daha fazlasını uygulama fırsatı yoktur. özgül aşırı yüklenmiş yöntemler. Bu bir kabus olurdu. – pickypg

+1

En önemlisi, bence, tembel olarak geçersiz kılınmış API'lere yol açacaktı, ki bu da içsel olarak uygun yöntemi çağırmak için kullanılabilecek inanılmaz derecede çirkin, boilerplate koduyla sonuçlanacak: void f (Object o) {if (tamsayı Tamsayı) f ((Tamsayı) o); } '. Ve sonra bunun nasıl çalışacağını sormalısın? Geçersiz kılma davranışına izin vermek için, 'Object' parametre yönteminin 'Integer' parametre yöntemini geçersiz kıldığı ve bu nedenle yukarıdaki kodun, sonsuza dek geri çekileceği için sonsuz bir yineleme döngüsüne (yığının taşmasına kadar) neden olacağı anlamına gelir. Nesne yöntemi. – pickypg

İlgili konular