SORU
4 Ocak 2010, PAZARTESİ


Yöntem yazın başka bir yöntem olarak aynı silinme vardır

Neden aynı sınıfta bu iki yöntem için yasal mı?

class Test{
   void add(Set<Integer> ii){}
   void add(Set<String> ss){}
}

compilation error alacağım

Yöntem(Set) aynı silme(Set) tipi Test başka bir yöntem olarak ekleyin.

bu bir çözüm ise, javac bu niçin sevmediğini merak ediyordum.

Birçok durumda, bu iki yöntemin mantığı çok benzer olacağını görebiliyorum ve bir tek yerini olabilir

public void add(Set<?> set){}

yöntem, ama bu her zaman böyle değildir.

Bu sadece constructors birinin adını değiştiremezsiniz çünkü bu tartışmalar sürer eğer 9 ** iki sahip olmak istiyorsanız ekstra can sıkıcı bir durum.

CEVAP
11 Aralık 2011, Pazar


Bu sınırlama, dil sözdizimi, kendisini çalışma zamanı Java değil bir parçası. Aslında, bu kural hala ham türlerini kullanan eski kod çatışmaları önlemek için tasarlanmıştır.

Bir derleyici gibi javac reddetmek, bu tür aşırı, ama eğer oluşturduğunuz bir sınıfın diğer yollarla (yazılı kendi derleyici, ya da kullanarak bir byte kod Mühendisliği Kütüphanesi gibi MİGROS) ile imzalar bu sadece farklı tip parametreleri javac derleyici edecek gidermek aramalar için doğru yöntem sizin sınıfta.

İşte bu jenerik Java tanıtıldı önce drawn from the JLS. Varsayalım, izin verilmedi neden bir örnek, bu gibi bazı kod yazdım

class CollectionConverter {
  List toList(Collection c) {...}
}

Dersim, böyle uzatmak:

class Overrider extends CollectionConverter{
  List toList(Collection c) {...}
}

Jenerik giriş sonra, kütüphanemi güncellemeye karar verdim.

class CollectionConverter {
  <T> List<T> toList(Collection<T> c) {...}
}

Herhangi bir güncelleme yapmak için hazır değil, Overrider sınıf rahat bırak. Doğru toList() yöntemi geçersiz kılmak için, tasarımcılar ham bir türü karar dil "geçersiz eşdeğer" herhangi bir generified yazın. Bu yöntem, ancak imza artık benim için üst sınıf olarak eşit' imza yöntemi hala geçersiz kılar. anlamına gelir

Şimdi, zaman geçer ve sınıf yükseltme için hazır mısınız karar verin. Ama küçük bir hata yaparsan, toList() mevcut ham yöntemi, düzenlemek yerineekleyinbu şekilde yeni bir yöntem:

class Overrider extends CollectionConverter {
  @Override
  List toList(Collection c) {...}
  @Override
  <T> List<T> toList(Collection<T> c) {...}
}

Ham türlerinin geçersiz denklik nedeniyle, her iki yöntem de geçerli bir form toList(Collection<T>) yöntemi geçersiz kılmak için. Ama tabii ki, derleyici tek bir yöntem gidermek gerekiyor. Bu belirsizliği ortadan kaldırmak için, sınıflar geçersiz kılma-denk-yani silme sonra aynı parametre türleri ile birden fazla yöntem birden çok yöntem var izin verilmez.

Anahtar bu bir dil kuralı raw türlerini, bir sınırlama değil, tür parametreleri silinmesi kaynaklanan kullanmaya devam izin vermek için tasarlanmıştır.

Eğer eski kod (kendi kullanarak, örneğin,-kesinlikle-Java dili) ortadan kaldırmak, aşırı yük fonksiyonları bu tür mükemmel. Yöntem çözünürlük derleme zamanı sırasında oluşur çünkü, silme önce yazın maddeleştirme bu işi yapmak için gerekli değildir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jason Rosolowski

    Jason Rosolo

    25 EKİM 2006
  • Kat Krazy

    Kat Krazy

    12 Kasım 2010
  • National Geographic

    National Geo

    7 Mayıs 2006