2010-06-24 20 views
55

Scala dilini araştırıyorum. Sık sık duyduğum bir iddia, Scala'nın Java'dan daha güçlü tip sisteme sahip olmasıdır.Scala'nın tip sisteminin avantajları

  • scalacjavac, mutlu derlemek tek bir çalışma zamanı hatası neden belli arabası programları reddeder: Bununla ne insanlar demek olduğunu düşünüyorum.
  • Bazı değişmezler, bir Scala programında, derleyicinin programcının koşulu ihlal eden kod yazmasına izin vermeyecek şekilde kodlanabilir.

Ben de öyle düşünüyorum? Öyleyse, lütfen bu örnekleri gösteren makalelere/bloglara/makalelere bakın.

+4

Java, "buggy programları" nı Scala'dan daha fazlasını derlemenize izin vermez; Ancak, Scala *, Java'dan çok daha fazla yapının [güvenli bir şekilde] ifade edilmesine - ve genellikle çok daha kolay bir yönteme - izin verir. Scala hala tip silmeden "acı çekiyor". –

+15

@pst: Evet, olacak. 'String [] dizeleri = {" foo "}; Nesne [] nesneler = dizgiler; nesneler [0] = yeni Nesne(); 'java'da sadece iyi derlenecek ve daha sonra çalışma zamanında bir NPE atar. Eşdeğer scala kodu derlenmez. – sepp2k

+5

@ sepp2k Ben bir NPE değil, atılan bir 'ArrayStoreException' olduğunu düşünüyorum. –

cevap

72

Scala Tipi sisteminin en önemli avantajı çok güçlü olmanın aksine uzak zengin ("The Scala Type System" bölümü) olmak değildir.
(Java bunlardan bazılarını tanımlayabilir ve başkalarını uygulayabilir, ancak Scala bunları yerleşiktir).
Ayrıca bkz. The Myth Makers 1: Scala's "Type Types", Steve Yegge's blog post yorumunda, "Scala'yı" Frankenstein'ın Canavarı "olarak" dağıttı ", çünkü" tür türleri ve tür türü türleri "vardır. Ek yöntemler için için "Zengin" sınıfları örtük dönüşüm ile yerine ilkel tipleri (Int, Çiftler, ...) kullanılan (değer anlambilgisi makul küçük veri yapıları için kullanışlı)

+0

Ayrıntılı bilgi için teşekkürler. Daha iyi anlaşılması için bağlantılı makaleleri okuyacağım. –

+1

Kendime not: ayrıca eski yanıtıma bakın http://stackoverflow.com/questions/2682673/what-compromises-scala-made-to-run-on-jvm/2682962#2682962 – VonC

+1

Kendine not: örtülü ve Yeni 2.8 bağlamına bağlı, "Tip Sınıfı" gibi desen kolayca tanımlanır ve kullanılır: http://dcsobral.blogspot.com/2010/06/implicit-tricks-type-class-pattern.html – VonC

14

Java ile ilgili temel güvenlik sorunu varyans ile ilgilidir. Temel olarak, bir programcı, Java'da çalışma zamanında atılan istisnalarla sonuçlanabilecek yanlış varyans bildirimlerini kullanabilirken, Scala buna izin vermez. Aslında, yanlış kodun üretilmesine izin verdiği için, Java'nın Array eşdeğeri olduğu gerçeği zaten bir sorundur. Örneğin, olarak sepp2k örneklenen:

String[] strings = {"foo"}; 
Object[] objects = strings; 
objects[0] = new Object(); 

Sonra, elbette, şeylerin her tür verir Java, ham türü vardır.

Ayrıca, Scala'nın da var olduğu gibi, döküm var. Java API'sı, yazı tipleriyle zengin ve Scala'nın case x: X => // x is now safely cast gibi bir deyimi yok. Tabii, bir vaka bunu başarmak için instanceof kullanın, ancak bunu yapmak için hiçbir teşvik yoktur. Aslında, Scala'nın asInstanceOf kasten ayrıntılıdır.

Scala'nın sistem türünü daha güçlü yapan şeyler bunlar. VonC'un gösterdiği gibi, daha zengin.

+0

Son olarak, "daha genel" listeden daha "konuyla ilgili" bir cevap;) +1 – VonC

+0

orijinal soruyu doğru bir şekilde cevapladınız, ancak VonC biraz farklı bir soruyu detaylı bir şekilde yanıtladı. Cevabını doğru olanı olarak seçiyorum, ama cevabınız da çok beğeniliyor. Umarım itibar noktalarını kaçırmazsın. –

+0

@binil Hiç de değil. VonC'nin cevabı, gerçekten fazladan üniteye ihtiyaç duymasa bile harika. –