SORU
15 NİSAN 2014, Salı


Varsayılan bir yöntem ile bir arayüz başlatıldı?

Java Dil Şartnamesi this question cevap ararken that öğrendim

Bir sınıf başlatılmadan önce, doğrudan üst sınıf olmalı başlatılmışama arabirimleri sınıfı tarafından uygulanmadı başlatıldı.Benzer şekilde, bir arabirim superinterfaces değildir arabirim önce başlatıldı başlatıldı.

Kendi merakım için, ben denedim ve gerçekten arabirimi InterfaceType başlatılmadı.

public class Example {
    public static void main(String[] args) throws Exception {
        InterfaceType foo = new InterfaceTypeImpl();
        foo.method();
    }
}

class InterfaceTypeImpl implements InterfaceType {
    @Override
    public void method() {
        System.out.println("implemented method");
    }
}

class ClassInitializer {
    static {
        System.out.println("static initializer");
    }
}

interface InterfaceType {
    public static final ClassInitializer init = new ClassInitializer();

    public void method();
}

Bu program yazdırır

implemented method

Eğer arayüz default bir yöntem beyan eder, ancak sonra başlatma oluşur. InterfaceType arabirim olarak verilen düşünün

interface InterfaceType {
    public static final ClassInitializer init = new ClassInitializer();

    public default void method() {
        System.out.println("default method");
    }
}

daha sonra aynı program yazdırabilirsiniz

static initializer
implemented method

Diğer bir deyişle, arayüz static alanı (step 9 in the Detailed Initialization Procedure) başlatıldı ve bu tür başlatıldı static başlatıcı yürütülür. Bu arayüz başlatıldı anlamına gelir.

Bu İDEA bir şey bunun olması gerektiğini belirtmek için bulamadım. Bu uygulama sınıf yöntemi için bir uygulama sağlamaz halinde olması gerektiğini anlıyorum, ama eğer bunu yaparsa ne beni yanlış anlama,? Bu durum, Java Dil Şartnamesi eksik, bir şey özledim, ya da yanlış yorumlanması mıyım?

CEVAP
22 NİSAN 2014, Salı


Bu çok ilginç bir konudur!

JLS section 12.4.1 Bu kesinlikle karşılar gibi görünüyor. Ancak, Oracle ile İLGİLENİYORUZ ve OpenJDK () javac ve Noktasal davranışını burada belirtilen ne farklıdır. Özellikle, bu bölümde Örnek 12.4.1-3 arabirim başlatma kapsar. Aşağıdaki gibi örnek

interface I {
    int i = 1, ii = Test.out("ii", 2);
}
interface J extends I {
    int j = Test.out("j", 3), jj = Test.out("jj", 4);
}
interface K extends J {
    int k = Test.out("k", 5);
}
class Test {
    public static void main(String[] args) {
        System.out.println(J.i);
        System.out.println(K.j);
    }
    static int out(String s, int i) {
        System.out.println(s   "="   i);
        return i;
    }
}

Beklenen çıkış:

1
j=3
jj=4
3

ve nitekim beklenen çıktıyı alıyorum. Eğer varsayılan bir yöntem arayüzü eklenir ancak I,

interface I {
    int i = 1, ii = Test.out("ii", 2);
    default void method() { } // causes initialization!
}

çıkış için değişiklikler:

1
ii=2
j=3
jj=4
3

I arabirim önce değildi nerede başlatılmış olduğunu açıkça gösteriyor! Varsayılan yöntem sadece varlığının başlatma tetiklemek için yeterlidir. Varsayılan yöntemi olarak adlandırılan ya da belirtilen geçersiz olmak zorunda değil, ne de soyut bir yöntem tetik başlatma varlığı yok.

Benim düşünceme göre Noktasal uygulama invokevirtual çağrı kritik yol sınıf/arayüzü başlatma kontrol ekleyerek kaçınmak istedim. Önce 8 Java ve varsayılan yöntemleri, invokevirtual hiç bu ortaya değildi yani bir arayüz kod yürütme sonunda, olabilir. Bu yöntem, tablo gibi şeyler başlatır hangi sınıf/arayüzü hazırlık aşaması (JLS 12.3.2) bir parçası olduğunu düşünebilirsiniz. Ama belki de bu çok ileri gitti ve yanlışlıkla tam başlatma yerine yaptı.

raised this question I derleyici-dev posta OpenJDK listede. Hangi soru daha JVM ve lambda uygulama ekiplerine yönelik yükseltiyor reply from Alex Buckley (İDEA editörü) oldu. O "T bir sınıf statik bir yöntem T tarafından ilan çağrılır" da ise T arabirimi uygulamalıdır. diyor spec burada bir hata var o da notlar İşte özellikleri ve Noktasal böcekler de vardır.

Açıklama: OpenJDK Oracle için çalışıyorum. Eğer insanlar bu ödülümü bu soruya gelince de haksız bir avantaj sağlayacağını düşünüyor, bu konuda esnek olmaya hazırım.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • backyardjay

    backyardjay

    8 ŞUBAT 2009
  • tychoadragmire

    tychoadragmi

    20 Mart 2006
  • WestsideMrArO

    WestsideMrAr

    6 EKİM 2010