2013-08-21 12 views

Odpowiedz

10

Cóż, tak, to jest poprawne.

Podczas definiowania cechę Foo, to pod maską tworzyć zarówno (JVM) i interfejs Foo (JVM) klasę Foo$class ze wszystkich wdrożeń metod określonych jako metody statyczne. Odpowiedni kod Java będzie wyglądać mniej więcej tak (dla nowego umowach definicja Foo):

interface Foo { 
    Option<String> verifyConsistency(); 
} 

class Foo$class { 
    static Option<String> verifyConsistency(Foo self) { 
    Predef.???(); 
    } 
} 

Kiedy mieszać Foo do konkretnej klasy Bar, co dzieje się na poziomie JVM że Bar rozszerza interfejs Foo, i wdraża metodę verifyConsistency po prostu przekierowania połączenia do Foo$class:

class Bar implements Foo { 
    Option<String> verifyConsistency() { 
    return Foo$class.verifyConsistency(this); // simple forwarding 
    } 
} 

powodem, że odbywa się to w ten sposób jest to, że model obiektowy JVM nie obsługuje wielokrotnego dziedziczenia. Implementacji cech nie można po prostu umieścić w klasach, od których można rozszerzyć, ponieważ można rozszerzyć tylko jedną klasę na maszynie JVM.

Zabranie tej sytuacji polega na tym, że za każdym razem, gdy konkretna klasa miesza cechy, klasa definiuje metody "stub" dla każdego członka cechy (metody te po prostu przekazują do rzeczywistej implementacji, która jest metodą statyczną).

Jedną z konsekwencji jest to, że jeśli dodasz nową metodę do cechy, nawet jeśli zdefiniujesz implementację to nie wystarczy: konkretne klasy, które mieszają cechę, muszą zostać ponownie skompilowane (tak, aby został dodany skrót do nowej metody do klasy). Jeśli nie dokonasz ponownej kompilacji tych klas, Twój program nie będzie działać, ponieważ będziesz miał teraz klasę, która jest podobno konkretna (nie abstrakcyjna) ORAZ rozszerza odpowiedni interfejs, ale w rzeczywistości brakuje implementacji dla nowej metody.

W twoim przypadku oznacza to posiadanie konkretnych klas, które rozszerzają interfejs Foo, ale nie mają żadnej implementacji dla verifyConsistency.

Stąd niezgodność binarna.

+1

Ok dzięki. Sądziłem, że cała ceremonia wokół cech polega na tym, że możesz dodawać metody i dopóki zapewnisz domyślną implementację, nie powinieneś przekompilowywać wszystkiego. Sądzę więc, że się myliłem :-( –

Powiązane problemy