Bu kural, hala ham türleri kullanan eski koddaki çakışmalardan kaçınmayı amaçlamaktadır.
JLS'den çekilmesine neden izin verilmediğini gösteren bir örnek . Diyelim ki, jenerikler Java ile tanıştırılmadan önce, böyle bir kod yazdım:
class CollectionConverter {
List toList(Collection c) {...}
}
Sınıfımı genişletiyorsun, şöyle:
class Overrider extends CollectionConverter{
List toList(Collection c) {...}
}
Jeneriklerin tanıtılmasından sonra kütüphanemi güncellemeye karar verdim.
class CollectionConverter {
<T> List<T> toList(Collection<T> c) {...}
}
Herhangi bir güncelleme yapmaya hazır değilsiniz, bu yüzden Overrider
sınıfınızı yalnız bırakırsınız . toList()
Yöntemi doğru bir şekilde geçersiz kılmak için , dil tasarımcıları ham türün herhangi bir türetilen türe "geçersiz kılmaya eşdeğer" olduğuna karar verdiler. Bu, yöntem imzanız artık resmi olarak benim sınıfımın imzasına eşit olmasa da, yönteminizin hala geçersiz kıldığı anlamına gelir.
Şimdi zaman geçiyor ve sınıfınızı güncellemeye hazır olduğunuza karar veriyorsunuz. Ama biraz sıkıyorsunuz ve mevcut ham toList()
yöntemi düzenlemek yerine , böyle yeni bir yöntem ekliyorsunuz :
class Overrider extends CollectionConverter {
@Override
List toList(Collection c) {...}
@Override
<T> List<T> toList(Collection<T> c) {...}
}
Ham türlerin geçersiz kılma denkliği nedeniyle, her iki yöntem de toList(Collection<T>)
yöntemi geçersiz kılmak için geçerli bir formdadır . Ancak elbette, derleyicinin tek bir yöntemi çözmesi gerekiyor. Bu belirsizliği ortadan kaldırmak için, sınıfların geçersiz kılmaya eşdeğer olan birden fazla yöntemi olmasına izin verilmez - yani, silindikten sonra aynı parametre türlerine sahip birden çok yöntem bulunur.
Anahtar, bu, ham türleri kullanarak eski kodla uyumluluğu korumak için tasarlanmış bir dil kuralıdır. Tür parametrelerinin silinmesinin gerektirdiği bir sınırlama değildir; yöntem çözünürlüğü derleme zamanında gerçekleştiğinden, yöntem tanımlayıcısına genel türler eklemek yeterli olacaktır.