Đ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.
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
Cách khắc phục: 'trait Foo [S:
senia
@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. –