Yanıtlar:
Chris'in cevabına bir açıdan katılmayacağım . Sınıflar Any
, AnyRef
ve AnyVal
vardır sınıflar. Ancak, JVM'nin içsel sınırlamaları nedeniyle bayt kodunda sınıflar olarak görünmezler.
Bu, Java'daki her şeyin bir nesne olmadığı gerçeğinden kaynaklanmaktadır. Nesnelere ek olarak, ilkeller var. Java'daki tüm nesneler neslinin altındadır java.lang.Object
, ancak ilkel öğeler ayrıdır ve şu anda * bir programcı tarafından genişletilemez. Ayrıca, ilkellerin yöntemlere değil, "işleçlere" sahip olduğuna dikkat edin.
Scala'da ise her şey bir nesnedir, tüm nesneler bir sınıfa aittir ve yöntemler aracılığıyla etkileşime girerler. Oluşturulan JVM bayt kodu bunu yansıtmaz, ancak bu, bayt kodunda olmasa bile, Java'nın jeneriklere sahip olması gibi, onları daha az yapmaz.
Dolayısıyla, Scala'da tüm nesnelerin nesli vardır Any
ve bu, hem Java'nın nesneler olarak gördüklerini hem de Java'nın ilkel olarak gördüklerini içerir. Java'da eşdeğeri yoktur çünkü böyle bir birleşme yoktur.
Java'da ilkel sayılan her şey AnyVal
Scala'dan gelmektedir. Scala 2.10.0 AnyVal
mühürlenene ve programcılar bunu genişletemeyene kadar. .Net üzerinde Scala ile ne olacağını görmek ilginç olmalı, çünkü tek başına birlikte çalışabilirlik Scala'nın en azından kullanıcı tanımlı "ilkelleri" tanımasını gerektiriyor.
Ayrıca genişletme Any
, AnyRef
eşdeğerdir java.lang.Object
(herhangi bir oranda JVM'de).
Scala 2.9.x'e kadar, bir kullanıcı onları genişletemedi Any
veya AnyVal
Java'dan referans veremedi , ancak Scala'da kullanılabilecek başka kullanımlar da vardı . Özellikle tip imzaları:
def f(x: AnyVal) = println(x)
def g(x: AnyRef) = println(x)
def h(x: Any) = println(x)
Her birinin ne anlama geldiği, sınıf hiyerarşisinden anlaşılır olmalıdır. Ancak dikkat edilmesi gereken nokta, bu f
ve h
otomatik kutuya g
alınacak , ancak olmayacak. Bu, Java'nın yaptığının biraz tersidir f
ve h
belirtilemez ve g
(ile tanımlanır java.lang.Object
) otomatik kutulamaya neden olur.
Scala 2.10.0'dan başlayarak, kullanıcı aşağıdaki anlamlarla AnyVal
veya Any
aşağıdaki anlamlarla genişletebilir :
Bir sınıf genişlerse AnyVal
, belirli koşullar altında öbek üzerinde onun için bir örnek oluşturulmaz. Bu, bu sınıfın alanlarının (2.10.0'da sadece tek bir alana izin verildiği - bu değişip değişmeyeceği görülmeye devam edecek), ister ilkel olsun, isterse diğer nesnelere referans olsun, yığın üzerinde kalacağı anlamına gelir. Bu, örnekleme maliyeti olmadan genişletme yöntemlerine izin verir.
Bir özellik uzanıyorsa Any
, o zaman her iki uzanan sınıfları ile birlikte kullanılabilir AnyRef
uzanan ve sınıfları AnyVal
.
Not: Benim görüşüme göre, Java muhtemelen "yapı" ilkellerine ve belki de yazı tiplerine izin verirken C # 'ı takip edecek, çünkü onlara başvurmadan paralellik iyi bir performansla başarmanın zor olduğu ortaya çıkıyor.
Bunu gördün mü? Sayfanın metninde bazı java birlikte çalışabilirlik açıklamaları var. http://www.scala-lang.org/node/128
Any
ve AnyVal
inanıyorum ki, scala tipi sistemin bir parçası ve sınıflar değiller (aynı şekilde Nothing
bir tip, bir sınıf değil). Bunları Java kodu içinden açıkça kullanamazsınız.
Bununla birlikte, Java / Scala birlikte çalışmasında, Java'yı kabul eden bir yöntem Object
bir scala Any
/ AnyRef
.
Gerçekte ne yapmaya çalışıyorsun?
AnyRef
alıcısı bana bunun benim için hala gizemli olduğunu hatırlattı.
AnyVal
olarak tanımlanmıştırsealed trait AnyVal extends Any
. Ama Scala 2.10 bu değiştiabstract class AnyVal extends Any with NotNull
ve uzatmak artık mümkünAnyVal
yeni değer sınıfları özelliği olan, örneğin:class MyValue(val u: Int) extends AnyVal
.