2015-06-07 14 views
5

'u gösteriyor Scala'yı yakın zamanda öğrenmeye başladım ve Scala kodumu Java'da kullanmaya çalıştım. İçe aktarılan jar dosyaları çalışır ve sınıflarım ve yöntemlerimi içerir; Ancak ben biraz i ithalatı için mevcut sınıflar arasında, ikisini de DiceRoller ve DiceRoller $ erişebilir, o bulunca sürpriz ve de böyle normal bir sınıfta attribute_ $ eq gibi yöntemleri ulaşabileceğini oldu .Java'da Scala'yı içe aktarma: garip sınıflar ve yöntemler

DiceRoller Scala nesne olarak tanımlanır, ve bu konuyla aydınlatacak halinde sınıfları geri kalanı, sınıf olarak tanımlanır.

Ayrıca anonim sınıflar ve işlevler ile ilgili temel teoriyi ve Scala'nın "==" gibi işlemleri nasıl ele aldığını biliyorum, bu yüzden bu konuyla ilgili olsa bile, bu benim amacım değil.

Java paketlerini içe aktarırken, bu sınıflara ve yöntemlere ulaşılamıyor. Scala jar dosyalarını içe aktarırken neden onları arayabilirim? Bu anonim sınıfları ve yöntemleri özel olarak ilan edebilir miyim?

cevap

9

JVM, Scala hakkında bir şey bilmiyor. Scala derleyicisi Scala yapılarını bir şekilde JVM yapılarına eşlemelidir.

Örneğin, JVM'nin nesneleri yoktur, bu nedenle Scala derleyicisi nesneleri bir tek örnekle sınıflara eşler.

JVM'nin özellikleri yoktur, bu nedenle sınıflara eşlenmeleri gerekir. (Aslında, özelliklerin eşlemesi oldukça karmaşıktır, aslında, özellikler birden çok sınıfa eşlenir.)

Scala'da, yöntemler JVM'de yöntemlerle geçersiz kılınabilir, yapamazlar. Bu nedenle, Scala alanlarının yöntemlerle geçersiz kılınabilecek bir şeye eşlenmesi gerekir.

Ayrıca, Java IDE'nizin Scala'nın JVM yapıları olarak Scala yapılarını nasıl kodladığıyla ilgili hiçbir şey bilmediğini de unutmayın. Örneğin, JVM anonim sınıflar hakkında hiçbir şey bilmiyor, bu yüzden Java derleyici, anonim sınıfları garip isimlerle düzenli olarak adlandırılmış sınıflar olarak kodlar. Java IDE'leri bu garip isimleri biliyor ve onlara göstermiyor, ancak Java IDE'leri Scala derleyicisinin kullandığı isimleri bilmiyor.

JVM, işlevler hakkında hiçbir şey bilmiyor. Şimdi, Java 8'in birinci sınıf işlevleri var ve Java IDE'lerinin anlayabileceği standart bir kodlama var, ancak Java'nın sahip olduğu öncekilerden önce Scala'nın sahip olduğu birinci sınıf fonksiyonlar vardı ve kodlama Java tasarımcılarından farklıydı. ile geldi. (Gerçi, Scala sonraki sürümlerinde değişecek.) Aynı şey Clojure, Groovy, Python, Ruby, JavaScript, Fantom, KOTLIN ve diğer tüm JVM dilleri ile olur

Not. Java araçları sadece onlar hakkında bilmiyorum.

İlgili konular