2013-12-17 19 views
5

böyle karışıklık içinde kullanın:"A with B" bir tür mü? Scala yılında

class C extends A with B 

Ben A with B bir alt sınıfıdır C olarak bu bildiriyi anlıyoruz. Bu doğru mu? Veya C, hem A hem de B'un alt sınıflarıdır (multi-devralmayı desteklemeyen JVM'de mümkün olduğunu düşünmüyorum)?

A with B bir türse, neden bu satır çalışmıyor?

classOf[A with B] 

Bir tür o desen maçında kullanılabileceğini gerçektir A with B düşünün bir diğer nedeni:

val c = new C 
val u = c match { case a: A with B => 1 } // 1 

cevap

4

Scala özellikleri yoluyla birden devralma destekler. Herhangi bir sınıf 0 veya 1 sınıfı uzatabilir, ancak aynı zamanda herhangi bir sayıda özelliği "karıştırabilir". sözdizimi gibi Yani C sınıfı tanımı fazla

class ((C extends A) with B) gibidir

class MyClass extends [ClassOrTrait] with [Trait] with [AnotherTrait] with ... 

çizgisinde olan (perde arkasında işler JVM sınırlamalara uymak için yeniden düzenler derleyici sihirli biraz vardır)

A with Bclass (C extends (A with B)) türüdür, ve bir tür adı olarak kullanılmış, ancak classOf yöntem bir sınıf ister:

scala> type AB = A with B 
defined type alias AB 

scala> classOf[AB] 
<console>:11: error: class type required but A with B found 
       classOf[AB] 
        ^

vs

scala> class AB extends A with B 
defined class AB 

scala> classOf[AB] 
res12: Class[AB] = class AB 
0

Ben @Dylan katılıyorum. A with B sadece bir tür tanımdır. Ancak, classOf[T] ile çalışabilmesi için, Scala tarafından oluşturulan bir Java sınıfı veya arabirimine sahip olması gerekir.

scala> trait A 
defined trait A 

scala> trait B 
defined trait B 

scala> trait AB extends A with B 
defined trait AB 

scala> class C extends A with B 
defined class C 

scala> type TypeAB = A with B 
defined type alias TypeAB 

scala> println(classOf[A]) 
interface $line3.$read$$iw$$iw$A 

scala> println(classOf[B]) 
interface $line4.$read$$iw$$iw$B 

scala> println(classOf[AB]) 
interface $line5.$read$$iw$$iw$AB 

scala> println(classOf[C]) 
class $line6.$read$$iw$$iw$C 

scala> println(TypeAB) 
<console>:8: error: not found: value TypeAB 
       println(TypeAB) 
         ^

scala> classOf[TypeAB] 
<console>:11: error: class type required but A with B found 
       classOf[TypeAB] 

Ayrıca Scala durumda yapıları içinde with maç için yönetmek anlamına ilginçtir.

İlgili konular