2010-01-22 40 views
6

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.

+0

Trông giống như một lỗi đối với tôi. –

+0

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ì đó? –

+0

@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 ". –

Trả lời

2

Dường như vô hại nếu tôi vô dụng. Loại x muốn không tồn tại, vì vậy bạn không thể chuyển nó vào phương thức. Cho dù vô dụng vô dụng nên là một lỗi biên dịch thời gian là một vấn đề của hương vị, tôi giả sử.

Nếu bạn nhìn vào những gì x thực sự thực hiện, nó dịch ngược thusly:

public java.lang.Object x(java.lang.Object); 
    Code: 
    0: aload_1 
    1: areturn 

đó là chính xác những gì các phương pháp sắc nên làm (tải đối số bất kể loại, trả lại). Bạn có thể viết nội dung nào đó tương đương với mã ít hơn nhiều:

trait AbstractType { type T } 
class Useless extends AbstractType { def identity(t: AbstractType#T) = t } 

Ngoại trừ không có loại nào AbstractType # T, vì vậy chúng tôi lại vô dụng.

Trừ khi tôi thiếu thứ gì đó.

3

Trong ví dụ của bạn, trình biên dịch thêm các giới hạn kiểu mặc định là >: Nothing <: Any. Ví dụ thứ hai dưới đây cho thấy một trường hợp mà một loại trừu tượng có thể sử dụng được (nếu không hữu ích).

scala> trait T { type A >: Nothing <: Any } 
defined trait T 

scala> 1: T#A 
<console>:6: error: type mismatch; 
found : Int(1) 
required: T#A 
     1: T#A 
    ^

scala> trait T { type A >: Int <: Int } 
defined trait T 

scala> 1: T#A       
res6: T#A = 1 

scala> "": T#A 
<console>:6: error: type mismatch; 
found : java.lang.String("") 
required: T#A 
     "": T#A 
    ^
+1

'trait T {type A>: Int <: Int}' chỉ là một cách phức tạp để xác định 'đặc điểm T {type A = Int}' kết quả là như nhau. –

+0

Vâng, đó là điểm tôi cố gắng truyền đạt. – retronym

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