Với các đặc điểm và lớp học sau đây. Tại sao điều này biên dịch? Điều này thực sự có thể được sử dụng cho một cái gì đó?Lớp bê tông với các thành viên loại trừu tượng
trait Container {
type A
}
trait AnotherContainer[B]{
def x(b : B) : B
}
trait Mixed extends Container with AnotherContainer[Container#A]
class Impl extends Mixed{
def x(a : Container#A) = a
}
new Impl().x _
scala> new Impl().x _
res0: (Container#A) => Container#A = <function>
Cập nhật:
class Baz { type T; }
thực sự là một tính năng nhưng tôi không thể tìm ra động lực cho nó: #1753.
Trông giống như một lỗi đối với tôi. –
Tại sao? B trong trường hợp của AnotherContainer trong hỗn hợp là A, vì vậy chữ ký cho x là nhất quán giữa AnotherContainer.x và Impl.x. Hay tôi đang thiếu một cái gì đó? –
@Randall Vâng, 'loại A' là trừu tượng, và tôi không thấy nó trở nên cụ thể ở bất cứ đâu. Vì vậy, tôi mong đợi 'Impl' không biên dịch, trả về lỗi" cần phải trừu tượng ". –