Tôi đang cố gắng tham số hóa một số phương pháp có thông số loại rất chung chung.Loại Scala: giới hạn trên ít nhất
Như một ví dụ, trong REPL tôi lần đầu tiên xác định:
trait Term
case class FunctionalTerm[+T <: Term](t: T) extends Term
trực giác, các phương pháp sau đây có một thuật ngữ và một FunctionalTerm, và trả về một cái gì đó với loại ít nhất trên ràng buộc của các loại hạn thông qua và loại đối số của FunctionalTerm:
def ex1[T1 <: Term, T3 <: X, FunctionalTerm[T1] <: X, X <: R, R <: Term](t1: FunctionalTerm[T1], s: T3): R = sys.error("TODO")
Cho đến nay rất tốt trong REPL.
Sau đó, tôi xác định ex2
như một chức năng tiện lợi mà thực hiện các hoạt động tương tự như ex1
, nhưng với các đối số đầu vào hoán đổi:
def ex2[T2 <: Term, T3 <: X, FunctionalTerm[T2] <: X, X <: R, R <: Term](s: T3, t2: FunctionalTerm[T2]): R = ex1(t2,s)
Cố gắng xác định ex2
trong REPL cung cấp cho các lỗi sau:
error: inferred type arguments [T2,T3,FunctionalTerm,T3,T3] do not conform to method ex1's type parameter bounds [T1 <: Term,T3 <: X,FunctionalTerm[T1] <: X,X <: R,R <: Term]
ex1(t2,s)
^
error: type mismatch;
found : FunctionalTerm[T2]
required: FunctionalTerm[T1]
ex1(t2,s)
^
error: type mismatch;
found : T3(in method ex2)
required: T3(in method ex1)
ex1(t2,s)
^
error: type mismatch;
found : R(in method ex1)
required: R(in method ex2)
ex1(t2,s)
^
Tôi đã dành khoảng hai ngày cố gắng tìm ra một giải pháp, và bây giờ hoàn toàn bị mắc kẹt. Tôi không thể tìm thấy bất kỳ thứ gì khác trên Google.
Vì danh sách đối số loại ex2
giống với ex1
nhưng với T1
và T2
đổi chỗ, tôi không hiểu là sai hoặc cách khắc phục.
Mọi trợ giúp sẽ được đánh giá cao!
Cập nhật
Least cận trên là một cá trích đỏ. Ví dụ có thể được chưng cất thêm.
Hai chức năng sau có thể được định nghĩa trong REPL mà không có lỗi:
def ex1[T1 <: Term, FunctionalTerm[T1] <: Term](t1: FunctionalTerm[T1]): Term = sys.error("TODO: ex1")
def ex2[T2 <: Term, FunctionalTerm[T2] <: Term](t2: FunctionalTerm[T2]): Term = ex1(t2)
Giới thiệu các tham số phụ X
dường như gây ra vấn đề. Tôi có thể định nghĩa như sau trong REPL:
def ex3[T1 <: Term, FunctionalTerm[T1] <: X, X <: Term](t1: FunctionalTerm[T1]): Term = sys.error("TODO: ex3")
Nhưng cố gắng để sau đó xác định:
def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)
cung cấp cho các lỗi:
error: inferred type arguments [T2,FunctionalTerm,Nothing] do not conform to method ex3's type parameter bounds [T1 <: Term,FunctionalTerm[T1] <: X,X <: Term]
def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)
^
error: type mismatch;
found : FunctionalTerm[T2]
required: FunctionalTerm[T1]
def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)
^
Vì vậy, tôi đoán câu hỏi trở thành: Tại sao tham số X
không được sử dụng trong chữ ký có hiệu ứng này?
Tôi quên nói rằng tôi đang sử dụng Scala 2.10-M3. –
Bạn không sử dụng các loại cao hơn mặc dù :-) –
@oxbow_lakes Oh ... Tôi cũng sửa –