1
我無法獲得帶有參數化類型的代碼以傳遞scala編譯器。我的目標是能夠表達(Predicate, Action)
對,如MyProg
對象所示。功能上的類型邊界
trait ProgBase {
type Predicate[T] = T => Boolean
type Action[T] = T => Unit
private var prog = List[(Predicate[Any], Action[Any])]()
final def on[T <: Any](pred: Predicate[T])(action: Action[T]) = {
prog = (pred, action) :: prog // gives type mismatch
}
// remainder of trait elided
}
object MyProg extends ProgBase {
on[String](s => !s.isEmpty) { s =>
println(s + " is not empty")
}
on[Int](i => i.isValidByte) { i =>
println(i + " can fit in a byte")
}
}
通過指定T
有一個上限的Any
,我希望這將安撫編譯器,但顯然我失去了一些東西:
[error] ......ProgBase.scala:8 type mismatch;
[error] found : (T => Boolean, T => Unit)
[error] required: (Any => Boolean, Any => Unit)
[error] prog = (pred, action) :: prog
[error] ^
通配符提示非常完美!是的,我打錯了行爲的主體,將解決。並感謝第三個問題,我想這是由於類型擦除。將看不成形。 – yotommy
我想補充說,沒有必要使用'<:Any',因爲'Any'是所有類型的超類型。但是,在我看來,你知道這一點。 – DaunnC