2016-09-15 13 views
5

Pytania dotyczące hierarchii klasowej Scala:klasa hierarchia Scala

  1. W IntelliJ IDE, szukam realizacji Any i AnyRef, ale one nie istnieją. Gdzie są zdefiniowane i jak mogę zobaczyć ich kod?

  2. czytam następujące w „Programowanie w Scala”

Jedyny przypadek, w którym == nie bezpośrednio zadzwonić równa jest pudełkowych klas numerycznych Javy, takie jak Integer lub długi. W Javie nowa Integer (1) nie jest równa nowej Long (1), nawet jeśli dla pierwotnych wartości 1 == 1L. Ponieważ Scala jest językiem bardziej regularnym niż Java, konieczne było poprawienie tej rozbieżności przez zastosowanie specjalnej metody == dla tych klas.

Hmm ... ale czy nie jest to == końcowa? Jak zrobili specjalny przypadek dla klas numerycznych Java?

+0

http://stackoverflow.com/questions/13010984/where-can-i-find-definition-of-scala-any-and-scala-anyref Może być pomocne w pierwszym pytaniu –

Odpowiedz

7

Any, AnyRef, Null i Nothing w rzeczywistości nie istnieją; są one dołączone, aby system typów kompletny, ale nie mają rzeczywistej reprezentacji. Można znaleźć a reference in Scala's repository, ale jak to się mówi, te nie kompilują się i istnieją tylko w celu dokumentowania i ładowania. Scala's 3 Any* s są w rzeczywistości wszystkie java.lang.Object w skompilowanym kodu bajtowym.

Dodatkowo, prymitywne klasy wartości (Int, Long, itd.) Są zdefiniowane jako final abstract, co oznacza, że ​​one również nie istnieją. Wszystkie ich metody są abstrakcyjne.

Aby wszystko wyglądało schludnie i porządnie, a co ważniejsze, pracuj, zadaniem kompilatora jest fałszowanie istnienia tych typów i wykonywanie magii, aby wszystko było razem. To pozwala == przeprowadzać sprawdzanie wartości NULL i poprawnie obsługiwać typy wartości, nawet jeśli jest to final, ponieważ kompilator robi wokół niego magię. W przypadku new java.lang.Integer(5) == new java.lang.Long(5) sprowadza się to do scala.runtime.BoxesRuntime.equalsNumNum(new java.lang.Integer(5), new java.lang.Long(5)).

+0

To dużo magia, czy był jakiś powód, dla którego nie byłoby to prostsze? Mówisz też, że kompilator faktycznie łamie ostateczną regułę, czy to nie jest problem (dla kogoś, kto patrzy na kod odniesienia, chociaż nie jest skompilowany)? – rapt

+0

@rapt W moich oczach to * jest * raczej proste. W Scala-land mamy dźwięk, * normalny * typ systemu z dolnym typem 'Nothing', top type' Any', prymitywy jako (prawie) normalne podklasy 'AnyVal', prymitywne ops jak' + 'i'/'jak normalne abstrakcyjne metody na klasach prymitywnych, itp. Magia ma miejsce, gdy ten system musi zostać zgnieciony na JVM i jej ograniczenia. – HTNW

+0

Nie pytam o projekt idealnego systemu, ale o jego wdrożenie. Czy wystąpił jakiś problem z zaimplementowaniem realnego Any, AnyRef, a także konkretnego Int, konkretnego Long, itp? – rapt

6

To całkiem normalne, że języki mają takie "magiczne" części. Części, których nie można opisać w samym języku.

Oczywisty przykład: możesz zadeklarować superklasę lub nie możesz zadeklarować superklasy, w takim przypadku nadklasa to AnyRef. Jak więc pisać Any, klasa, która nie ma żadnej nadklasy? Cóż, nie możesz. Można rozszerzyć język i pozwolić programistom pisać klasy bez żadnych klas nadrzędnych, ale wtedy nie można dłużej zagwarantować, że ta klasa będzie miała taką hierarchię dziedziczenia, a zatem hierarchia dziedziczenia nie będzie już tworzyć siatki. Ale reguły sprawdzania i interpretowania typów zależą od hierarchii dziedziczenia będącej siatką.

Jedynym rozsądnym wyborem jest posiadanie definicji Any, która nie może być wyrażona w samym języku.

Nie jest to charakterystyczne dla Scala: na przykład ten sam problem występuje w przypadku Javy i Ruby Object.

Właściwie Scala ma wiele mniej taki „magiczny” w porównaniu do innych języków nurtu ... i znaczący ułamek „magii” to ma mają to do zgodności platformy z bazowego ekosystem gospodarza (Java do Scala -JVM, ECMAScript dla Scala.js, CLI dla opuszczonego Scala.NET, CoreFoundation dla hipotetycznego Scala-macOS, itp.).

+0

Przepraszam, nie rozumiem twojego sformułowania. Superklasa ma co najmniej dwa znaczenia: klasę nadrzędną i najwyższą klasę nadrzędną (np. Obiekt w Javie) - którą miałeś na myśli? Także, co jest nie tak z robieniem 'Any' podklasy java.lang.Object, a jeśli dobrze cię zrozumiem obawiasz się, że' Any' nadal ma rodzica - to dlaczego nie wyłączyć go przez kompilator. W każdym razie, nadal można uzyskać dostęp do 'Object' ze Scala, więc' Any' nie jest tak naprawdę najwyższą klasą nadrzędną. – rapt

+1

@rapt "Any" w rzeczywistości jest najwyższą klasą nadrzędną. System typów jest zaprojektowany tak, że 'Any' jest powyżej' Object'. Możesz to udowodnić, uruchamiając 'niejawnie [Obiekt <: HTNW

+0

Masz rację, zaniedbałem ten fakt. Tak więc Any & AnyRef nie może tak naprawdę kompilować według ich kodu referencyjnego. Jakikolwiek pomysł, jaki byłby powód nie-konkretnych klas wartości (Int, Long, itp.)? – rapt

Powiązane problemy