2015-11-28 29 views
18

Cho một đơn giản Loại đại số dữ liệu của Parent:Trait bất ngờ hành vi

scala> sealed trait Parent 
defined trait Parent 

scala> case object Boy extends Parent 
defined object Boy 

scala> case object Girl extends Parent 
defined object Girl 

tôi xác định một đặc điểm:

scala> trait HasGirl { 
    | val x: Girl.type 
    | } 
defined trait HasGirl 

Sau đó, tôi tạo ra một lớp trường hợp đó thực hiện HasGirl, nhưng cung cấp một giá trị x của Boy.type.

scala> case class Thing(x: Boy.type) extends HasGirl 
defined class Thing 

tôi đã mong đợi một lỗi thời gian biên dịch, vì tôi không thấy làm thế nào một x loại Boy.type phù hợp với val x: Girl.type.

Điều gì đang xảy ra ở đây?

+0

Là 'x' trong' Thing' liên quan đến 'x' trong đặc điểm? –

+0

Vâng, 'Thing' mở rộng' HasGirl'. Vì sau này mong đợi một 'x' kiểu' Girl.type', tôi * tin rằng '' '' '' '' '' 'của' Thing' ánh xạ tới '' '' của 'HasGirl'. –

+2

Thật vậy, 'Thing (Boy) .asInstanceOf [HasGirl] .x' tạo' java.lang.ClassCastException: Boy $ không thể được truyền vào Girl $ '. Hấp dẫn. – ale64bit

Trả lời

1

Có vẻ như các loại singleton không có thành viên là loại tương đương bằng cách nào đó ở đây. Có lẽ đó là một lỗi (bạn đã nộp một vé). Ví dụ, sau đây tạo ra một thời gian chạy lỗi:

sealed trait Parent 
case object Boy extends Parent 
case object Girl extends Parent 

trait HasGirl { 
    val x: Girl.type 
} 

case class Thing(x: Boy.type) extends HasGirl { 
    def y: Girl.type = (this: HasGirl).x 
} 


val t = Thing(Boy) 
t.y // ClassCastException ! 

Nếu tôi thêm một thành viên, bạn nhận được một lỗi thời gian biên dịch:

sealed trait Parent 
case object Boy extends Parent 
case object Girl extends Parent { def hello = 1234 } 

trait HasGirl { 
    val x: Girl.type 
} 

case class Thing(x: Boy.type) extends HasGirl 
<console>:57: error: overriding value x in trait HasGirl of type Girl.type; 
value x has incompatible type 
     case class Thing(x: Boy.type) extends HasGirl 
         ^
+0

Đó là lỗi, theo https://issues.scala-lang.org/browse/SI-9574 –

Các vấn đề liên quan