Вы можете привязать параметр типа в некоторых случаях.Привязка таких параметров типа может использоваться для проверки типов в теле предложения сопоставления с образцом - из-за стирания эти привязки стираются, и это означает, что вы не можете различить их во время выполнения (такие вещи возможны в .NET CLR).
Ваш код, похоже, не использует этот тип - нужно было бы увидеть определения Node, End.Самый простой способ достичь желаемого - это просто игнорировать аргумент типа Node [T].Ниже приведен пример, который делает это с правильным синтаксисом.
Обратите внимание, что если вы хотите написать шаблон, соответствующий типу (универсальный или нет), он всегда имеет форму v : T
.Если, с другой стороны, вы подходите по классам прецедентов, то шаблон имеет формы C(p1...,pN)
.Спецификация языка содержит все детали.
Вместо привязки типа к переменной типа a
, мы также можем связать его с _
, чтобы подчеркнуть, что мы не используем этот тип.
trait Tree[+T]
abstract class Node[+T] extends Tree[T] {
def left: Tree[T]
def right: Tree[T]
}
object End extends Tree[Nothing]
object Visitor {
def inorder[T](root: Tree[T]) : Unit = {
root match {
case End => return;
case node:Node[a] => {
inorder( node.left ) // node.left has the type Tree[a]
println( node.toString );
inorder( node.right );
}
case _ => return;
}
}
}