SORU
2 Temmuz 2015, PERŞEMBE


8 varsayılan Java yöntemleri kaynak uyumluluk kırılır mı?

Genellikle Java kaynak kodu ileriye uyumlu olmuştur böyle olmuştur. Kadar 8, bildiğim kadarıyla, hem derlenmiş sınıfları Javavekaynak, ileri sonraki/JVM sürümleri ile uyumlu olduğunu GÖRDÜM. [Güncelleme: bu doğru değil, yorum Sırala', vb, aşağıda.] tekrar bakın Ancak, Java 8'de varsayılan yöntemlerin yanı sıra bu artık olmayacak gibi görünüyor.

Örneğin, ben kullanıyorum bir kütüphane List<V> sort() içeren java.util.List uygulaması vardır. Bu yöntem, liste sıralanmış içeriğini bir kopyasını döndürür. Bu kütüphane, jar dosya bir bağımlılık olarak dağıtılan bir proje inşa edilmekte olduğunu GÖRDÜM 1.8 kullanarak iyi çalıştı.

Kütüphane ile İLGİLENİYORUZ 1.8 kendisini kullanarak yeniden derleyin kaldım ancak daha sonra, ve Kütüphane artık derler bulundu: sort() kendi yöntemi şimdi 8 java.util.List.sort() Java varsayılan yöntemi ile çatışmaları List-Uygulama sınıfı. Java 8 sort() varsayılan yöntem sıralar listesinde yer verir void); benim kütüphane sort() yöntem - yana döndürür yeni bir sıralama listesi vardır uyumsuz bir imza.

Bu yüzden benim temel soru şu:

  • 1.8 FIRSATLAR Java kaynak kodu için ileri bir uyumsuzluk varsayılan yöntemleri yüzünden tanıtmak değil mi?

Ayrıca:

  • Bu ileri uyumsuz ilk kez böyle bir değişiklik?
  • Bu tasarlanan ve uygulanan varsayılan yöntemleri zaman kabul veya ele? Her yerde belgelenmiş mi?
  • (Kuşkusuz küçük) rahatsızlık faydaları versus indirimli mıydı?

Aşağıdaki ve 1.7 altında ve derler çalışan bazı kod bir örnektir 1.8 - ama 1.8 altında derleme not: altında çalışır

import java.util.*;

public final class Sort8 {

    public static void main(String[] args) {
        SortableList<String> l = new SortableList<String>(Arrays.asList(args));
        System.out.println("unsorted: " l);
        SortableList<String> s = l.sort(Collections.reverseOrder());
        System.out.println("sorted  : " s);
    }

    public static class SortableList<V> extends ArrayList<V> {

        public SortableList() { super(); }
        public SortableList(Collection<? extends V> col) { super(col); }

        public SortableList<V> sort(Comparator<? super V> cmp) {
            SortableList<V> l = new SortableList<V>();
            l.addAll(this);
            Collections.sort(l, cmp);
            return l;
        }

    }

}

Aşağıdaki bu kod derlenmiş (veya başarısız) ve idare edildiğini gösterir.

> c:\tools\jdk1.7.0_10\bin\javac Sort8.java

> c:\tools\jdk1.7.0_10\bin\java Sort8 this is a test
unsorted: [this, is, a, test]
sorted  : [this, test, is, a]

> c:\tools\jdk1.8.0_05\bin\java Sort8 this is a test
unsorted: [this, is, a, test]
sorted  : [this, test, is, a]

> del Sort8*.class

> c:\tools\jdk1.8.0_05\bin\javac Sort8.java
Sort8.java:46: error: sort(Comparator<? super V>) in SortableList cannot implement sort(Comparator<? super E>) in List
                public SortableList<V> sort(Comparator<? super V> cmp) {
                                       ^
  return type SortableList<V> is not compatible with void
  where V,E are type-variables:
    V extends Object declared in class SortableList
    E extends Object declared in interface List
1 error

CEVAP
2 Temmuz 2015, PERŞEMBE


1.8 FIRSATLAR Java kaynak kodu için ileri bir uyumsuzluk varsayılan yöntemleri yüzünden tanıtmak değil mi?

Üst sınıf veya bir arayüz yeni bir yöntem uyumluluk kesebilirsiniz. Varsayılan yöntemdaha az muhtemelbu arabirim değişikliği uyumluluk kesilir. Varsayılan yöntemleri arayüzleri için yöntemler ekleme için kapıyı açık anlamda, varsayılan yöntemleri kırık uyumluluk katkıda bulunduğunu söyleyebiliriz.

Bu ileri uyumsuz ilk kez böyle bir değişiklik?

Java 1.0 standart kütüphaneden sınıflara sınıflar geldiğimizden beri neredeyse kesinlikle değil.

Bu varsayılan yöntemleri tasarlanan ve uygulanan kabul veya ele? Her yerde belgelenmiş mi?

Evet, kabul edildi. Brian Goetz Ağustos 2010 kağıt "Interface evolution via “public defender” methods" bkz

10=başlangıç
  • Kaynak uyumluluk

    Bu düzen, kütüphane arayüzleri mevcut sınıflar yöntemleri ile uyumsuz Ekle yeni yöntem için modifiye ölçüde kaynak uyumsuzluklar tanıtmak mümkündür. (Örneğin, eğer bir sınıf bir şamandıra değerli xyz() yöntemini uygular Toplama, ve biz eklemek bir int değerli xyz() yöntemi için Toplama, varolan bir sınıf artık derleme.)

  • (Kuşkusuz küçük) rahatsızlık faydaları versus indirimli mıydı?

    Önce bir arabirim değiştirmekesinlikleuyumluluk kırmak. Şimdi, buolabilir. Giden 'kesinlikle' için 'olabilir' olumlu ya da olumsuz. Bir yandan, mümkün arayüzleri eklemek için yapar. Diğer yandan, arayüzler de sınıflarıyla, ama uyumsuzluk gördün tür, sadece kapıyı açar.

    Faydaları Goetz kağıt üstünde ifade edildiği gibi rahatsızlıklar daha büyük olsa da,:

    1. Problem durumu

    Bir kez yayımlanan, imkansız mevcut uygulamaları bozmadan bir arabirim eklemek için. Artık bir kütüphane zamandan beri süre yayınlandı, daha büyük olasılıkla bu kısıtlama onun tutucular için keder neden olacak.

    Yapışkan notlar 7 yerde Java dili için kapatma ayrıca yaşlanma Toplama arabirimleri üzerinde ek stres; kapanışları en önemli faydalarından biri daha güçlü kütüphanelerin gelişmesini sağlar. Aynı zamanda çekirdek kütüphaneleri bu özellikten yararlanmak için uzanan olmasa daha iyi kütüphaneler sağlayan bir dil özelliği eklemek için hayal kırıklığı olurdu.

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

    YORUMLAR

    SPONSOR VİDEO

    Rastgele Yazarlar

    • Bryan Smith

      Bryan Smith

      12 Mart 2006
    • DeAdPiXel6667

      DeAdPiXel666

      2 Ocak 2010
    • parlophone

      parlophone

      28 ŞUBAT 2006