Tôi muốn xác định một đặc điểm Swappable
với hai giá trị x,y
và một phương pháp swap
như vậy gọi swap
vào một đối tượng kế thừa từ Swappable
lợi nhuận một đối tượng cùng loại với x,y
chuyển. tốt nhất của tôi cho đến nay là:Trait thể thay thế nhanh trong Scala
trait Swappable[T] {
val x: T
val y: T
def swap: Swappable[T] = {
val (a,b) = (x,y)
new Swappable[T] { val x=b; val y=a }
}
}
Nhưng đây không phải là những gì tôi muốn vì kiểu trả về của swap là một số lớp ẩn danh, thay vì lớp ban đầu tôi bắt đầu với, vì vậy tôi nhận được lỗi như:
def direct[S<:Swappable[Int]](s: S): S = if (s.x > s.y) s else s.swap
<console>:32: error: type mismatch;
found : Swappable[Int]
required: S
def direct[S<:Swappable[Int]](s: S): S = if (s.x > s.y) s else s.swap
^
Tôi có thể làm những gì tôi đang cố gắng làm không? Chữ ký loại chính xác cho trao đổi là gì?
Very nice! Bạn làm cho một điểm tốt là khái niệm về trao đổi không rõ ràng nói chung. Trong tình huống của tôi, tôi sẽ chỉ mở rộng 'Swappable' với các trường hợp 'Foo (x: T, y: T)' không chứa thêm giá trị nào, nhưng không có nhiều cách để Scala biết điều đó. Vì vậy, tôi đoán tôi sẽ để lại việc thực hiện phương thức 'swap' cho mỗi lớp kế thừa (mà về cơ bản là những gì bạn làm, thông qua phương thức bổ sung' cons'). Chìa khóa để thực hiện điều này (mà tôi đã không nghĩ đến) là truyền tham số kiểu bổ sung 'A' sang' Swappable', cho phép kế thừa các lớp kế thừa kiểu trả về. Cảm ơn! – davidsd