6

Chỉnh sửa: Nhờ Derek chỉ ra phần quan trọng của thông báo lỗi, tôi có thể trích xuất phần quan trọng hơn một chút và có vẻ như về các loại tồn tại. Nếu tôi hiểu số §3.2.10 Định lượng tồn tại trên giá trị trong tham chiếu ngôn ngữ chính xác, thì val m: Map[x.type#S, x.type#S] forSome { val x: T } là viết tắt của val m: Map[t#S, t#S] forSome { type t <: T with Singleton }. Tuy nhiên, trong đoạn code dưới đây, chúng hoạt động khác nhau.Chức năng ghi đè với các tham số kiểu phụ thuộc vào đường dẫn

trait Type { 
    type S 
} 

class Concrete extends Type { 
    type S = Double 
} 

trait BaseWorks { 
    type T <: Type 
    val m: t#S forSome { type t <: T with Singleton } 
} 

class Works extends BaseWorks { 
    override type T = Concrete 
    override val m = 0.0 
} 

trait BaseError { 
    type T <: Type 
    val m: x.type#S forSome { val x: T } 
} 

class Error extends BaseError { 
    override type T = Concrete 
    override val m = 0.0 
} 

Tinh chỉnh BaseWorks công trình, trong khi tinh chỉnh BaseError dẫn đến lỗi error: overriding value m in trait BaseError of type Error.this.x.S forSome { val x: => Error.this.T }; value m has incompatible type. Tôi có hiểu sai §3.10.10 không?

bài gốc: Trong đoạn mã sau Scala trình biên dịch (2.9.0.1) tạo ra một lỗi nói rằng phương pháp f2 ghi đè không có gì trong Derived.

abstract trait Type { 
    type T1 
    type T2 
    type P = (T1, T2) 
} 

class ConcreteType extends Type { 
    type T1 = Double 
    type T2 = Double 
} 

abstract class Base { 
    type T <: Type 
    type TP = T#P 
    def f1(v: TP): TP 
    def f2(v: T#P): T#P 
    def f3(v: T#P): T#P 
} 

class Derived extends Base { 
    override type T = ConcreteType 
    override def f1(v: TP): TP = v 
    override def f2(v: T#P): T#P = v 
    override def f3(v: TP): TP = v 
} 

Mặt khác, trọng chức năng f3 với cùng chữ ký chính xác như thể hiện trong các tác phẩm mã. Tôi hy vọng rằng cả hai hàm đều hoạt động giống nhau. Tại sao điều này không đúng?

+0

Lỗi mở với trình biên dịch Scala https://issues.scala-lang.org/browse/SI-4914. –

Trả lời

5

(FYI, tôi đang sử dụng 2.9.0.1)

tôi đã không thể tìm ra lý do cho điều này trong spec nhưng được thông báo lỗi bạn nhận được, ít nhất, làm cho lý do cuối cùng rõ ràng. Đây là phần quan trọng:

(Note that (_5.T1, _5.T2) forSome { val _5: Base.this.T } 
does not match 
(_16.T1, _16.T2) forSome { val _16: Base#T } 

Base.this.T không tương đương với Base#T. Cái trước là một kiểu phụ thuộc vào đường dẫn dựa trên cá thể this, nơi mà sau này là một phép chiếu kiểu không phải là cá thể dựa.

Điều này có vẻ là do thứ tự loại độ phân giải. TP được giải quyết liên quan đến việc đánh giá Base trong khi T#P được giải quyết liên quan đến việc đánh giá Derived.

Nếu ai đó có thể trỏ đến vị trí trong thông số có thể giải thích điều này đúng cách, tôi rất muốn đọc nó.

+0

Hi Derek. Cảm ơn bạn đã chỉ ra phần quan trọng. Tôi đã có thể giải nén phần quan trọng hơn một chút. Tôi sẽ cập nhật bài đăng ở trên. –