У меня возникли проблемы с получением моего кода с параметризованными типами для передачи компилятора 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