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?
Lỗi mở với trình biên dịch Scala https://issues.scala-lang.org/browse/SI-4914. –