2011-12-08 17 views
8

aşağıdaki Scala nesne Verilen:Scala nesnesinin Java'ya parantez olmadan erişebilmesini sağlayabilir miyim?

object ScalaObject { 
    val NAME = "Name" 
} 

O Scala derleyici NAME alanını erişmek için bir parametresiz yöntemini oluşturur anlaşılmaktadır.

System.out.println(ScalaObject$.MODULE$.NAME()); 

erişimine Java izin Scala derleyici ikna için bir yol var mı: ı Java bu alanı erişmeye çalıştığınızda Ancak, bu alanı erişmek için tek yol gibi görünüyor gibi parametresiz yöntemi olarak ise olarak beklenen Java deyim başına val:

System.out.println(ScalaObject$.MODULE$.NAME); 
+0

Aynı durum küçük harfli vals ile de olur mu? – ziggystar

+0

Beklenen * Java * deyim bu, beklenen * Scala * deyim. Bayt kodu açısından, Scala (hemen hemen her zaman?), Alanları her zaman aynı adı taşıyan alıcı yöntemleri olarak gösterir. –

+1

@AndrzejDoyle, söylediklerinden emin değilim. Java'da, parantez olmadan statik final alanlarına erişmesi beklenir çünkü bunu yapmanın tek yolu. Düşündüğünüz şey, Scala'da beklenen teknik, getter yöntemlerini kullanmaktır. Ne olursa olsun, Scala'nın tercih ettiği teknik ne olursa olsun, Scala'da uygulanacak bir API'nin bir Java istemcisi ile alakalı görünmüyor. –

cevap

7

Kesinlikle, yanıt hayır, çünkü scala sadece bir alan oluşturmuyor, ancak buna erişmek için bir çift yöntem. Bununla birlikte val numaralı skaleyi @scala.reflect.BeanProperty ile ekleyerek, Java stili alıcı ve ayarlayıcı yöntemleri üretecektir.

böylece (sizin durumunuzda) söylemek mümkün olmaz ise

ScalaObject$.MODULE$.NAME 

Sen

ScalaObject$.MODULE$.getNAME() 

daha Java benzeri deyim aşağıdakilerden hangisidir söylemek mümkün olacaktır Sadece umduğun gibi değil.

N.B. @BeanProperty'u böyle bir büyük harfle denemedim, bu yüzden aslında ne üreteceğinden emin değilim.

1

Hayır, byte alanını erişebilir ve yöntemi çağırmak için farklı talimat var çünkü. Daha sonra Javac'ı (ve IDE sözdizimi vurgulayıcıyı) kullanmalısınız.

+4

OP'nin scalacın Java alanları üretmesi için bazı ek açıklamaların beklediğini düşünüyorum, derlenmiş Java yöntemlerini alanlar olarak kullanmanın bir yolu değil. – themel

+0

@themel doğrudur. –

İlgili konular