我在某些情況下使用類型設計API,但是我遇到了隱式解決方案的問題。如下所示,如果存在類型A的隱式對象,但類型B extends A
的對象被傳遞給該方法,則無法找到隱式對象。有沒有辦法讓這個工作或調用者必須將隱式對象放入每個子類的作用域中?在Scala中輸入類模式不考慮繼承?
下面是一個例子:
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)
這失敗與以下輸出編譯:
/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)
我也嘗試將調用的定義更改爲: def call [X,X2 <:X](x:X2) (隱含x2:T [X])= println(x) 而這並沒有幫助 – 2010-10-06 06:41:13