Этот код должен скомпилироваться в Scala:
trait Pipe {
type Input
type Output
def apply(input: Input): Output
}
object Pipe {
trait Start extends Pipe {
override type Input = Seq[String]
}
abstract class Connect(val prev: Pipe) extends Pipe {
override type Input = prev.Output
}
}
object Pipe1 extends Pipe.Start {
override type Output = Int
override def apply(input: Input): Output =
input.length
}
object Pipe2 extends Pipe.Connect(prev = Pipe1) {
override type Output = Boolean
override def apply(input: Input): Output =
input%2 == 0
}
Pipe1
компилируется нормально, но Pipe2
не компилируется с:
value % is not a member of Pipe2.this.Input
input%2 == 0
^
Я знаю, что могу решить эту проблему с помощью обобщенных, а не зависимых типов, но это должно работать, поскольку Pipe2.Input
должно проверять тип, равное Int
из Pipe1.Output