2013-08-06 21 views
12

loại đường phụ thuộc rất hữu ích:Các loại phụ thuộc không hoạt động đối với các nhà thầu?

trait Sys { 
    type Global 
} 
def foo[S <: Sys](system: S)(global: system.Global) =() 

Tại sao không làm việc này cho nhà xây dựng?

class Foo[S <: Sys](val system: S)(val global: system.Global) 

Hoặc tôi chỉ làm sai?

+0

Tôi đã tìm thấy câu này trong SLS: * Tuy nhiên, thông số giá trị chính thức có thể không tạo thành một phần của bất kỳ loại nào của lớp cha hoặc thành viên của mẫu lớp t. * (5.3, p56) liên quan đến * chính thức mệnh đề tham số giá trị cho hàm tạo chính *. – Beryllium

+4

Cách khắc phục: 'trait Foo [S: senia

+0

@senia Có, tôi đang sử dụng một đặc điểm bây giờ, phương pháp xây dựng là khá xấu xí mặc dù, nhưng nó hoạt động. –

Trả lời

5

Điều này có vẻ giống như một lỗi đối với tôi. Chỉnh sửa: tìm thấy nó, đây là SI-5712.

Mục §5.3 của 2,9 SLS nói:

(ps1). . . (psn) là mệnh đề tham số giá trị chính thức cho hàm khởi tạo chính của lớp. Phạm vi của thông số giá trị chính thức bao gồm tất cả các phần tham số tiếp theo và mẫu t.

Có một ngoại lệ:

Tuy nhiên, một số giá trị chính thức có thể không là một phần của các loại bất kỳ của các lớp phụ huynh hoặc thành viên của lớp mẫu t.

Nhưng nó nói nó không thể là một phần của các loại bất kỳ của các lớp phụ huynh hoặc thành viên, không phải của bất kỳ trong những phần thông số sau, vì vậy nó không dường như cấm các loại đường phụ thuộc giữa nhóm đối số.

Bạn có thể đi xung quanh với một constructor thứ:

class Foo[S <: Sys] private[this]() { 
    def this(system: S)(global: system.Global) = this 
} 

Sửa: constructor workaround thứ này không phải là rất tốt: nếu tiếp xúc system hoặc global trở nên rất khó khăn bởi vì chỉ có các nhà xây dựng chính có thể tuyên bố val s .

Một ví dụ với một dàn diễn viên:

class Foo[S <: Sys] private[this]() { 
    private[this] var _system: S = _ 
    private[this] var _global: system.Global = _ 

    def this(system0: S)(global0: system0.Global) = { 
    this 
    _system = system0 
    _global = global0.asInstanceOf[system.Global] 
    } 

    lazy val global: system.Global = _global 
    lazy val system: S = _system 
} 

Nhưng điều này là nhận được khủng khiếp. @ đề nghị của senia là tốt hơn nhiều.

+0

Ok. Tuy nhiên, vấn đề với hàm tạo thứ cấp là theo cách này tôi sẽ không thể xây dựng một 'Foo' có' def global: system.Global' (tôi chưa thử, nhưng có vẻ không thể) –

+0

Hum, bạn Đúng rồi, không có cách nào dễ dàng cho 'Foo' để phơi bày những giá trị này. Bạn sẽ cần ít nhất một 'var' và một diễn viên, mà là một chút buồn, xem chỉnh sửa. – gourlaysama

+1

Cảm ơn bạn đã đào lên vé lỗi –

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