Tôi đang thiết kế một lớp API sử dụng loại trong một số trường hợp tuy nhiên tôi đã gặp phải một vấn đề với độ phân giải ngầm định. Như được hiển thị bên dưới, nếu có một đối tượng ẩn cho loại A nhưng đối tượng thuộc loại B extends A
được chuyển đến phương thức, thì không thể tìm thấy đối tượng ẩn. Có cách nào để thực hiện công việc này hoặc người gọi có phải đặt các đối tượng ngầm vào phạm vi cho mỗi phân lớp không?Loại mẫu lớp trong Scala không xem xét thừa kế?
Dưới đây là một ví dụ:
class A
class B extends A
class T[+X]
object T {
implicit object TA extends T[A]
}
def call[X:T](x:X) = println(x)
// compiles
call(new A)
// doesn't compile
call(new B)
var a = new A
// compiles
call(a)
a = new B
// compiles
call(a)
val b = new B
// doesn't compile
call(b)
này thất bại trong việc biên dịch với đầu ra sau đây:
/private/tmp/tc.scala:16: error: could not find implicit value for evidence parameter of type this.T[this.B] call(new B) ^ /private/tmp/tc.scala:28: error: could not find implicit value for evidence parameter of type this.T[this.B] call(b)
Tôi cũng đã cố gắng thay đổi định nghĩa của cuộc gọi tới: def call [X, X2 <: X] (x: X2) (ẩn x2: T [X]) = println (x) Và điều đó không giúp được –