0

我一直在试图理解这篇文章中提出的问题的答案。

下面的代码重现了接受的答案中提出的解决方案。

object Finder {
  def find[T <: Node](name: String)(implicit e: T DefaultsTo Node): T = 
    doFind(name).asInstanceOf[T]
}    

sealed class DefaultsTo[A, B]
trait LowPriorityDefaultsTo {
  implicit def overrideDefault[A,B] = new DefaultsTo[A,B]
}
object DefaultsTo extends LowPriorityDefaultsTo {
   implicit def default[B] = new DefaultsTo[B, B]
}

如果隐式定义为

(implicit e:  DefaultsTo[T, Node])

但相反,它是用看起来像中缀符号的东西定义的。我从来不知道一个类型DefaultsTo[T, Node]可以写成T DefaultsTo Node. 这是怎么回事?

4

1 回答 1

2

但相反,它是用看起来像中缀表示法的东西定义的。我从来不知道类型 DefaultsTo[T,Node] 可以写成“T DefaultsTo Node”。这是怎么回事?

是的。规则很简单:类型必须正好有 2 个参数。它主要用于具有符号名称的类型,例如<:<,但正如您所见,它也适用于字母数字名称。

Scala 规范,3.2.8 中缀类型

InfixType     ::=  CompoundType {id [nl] CompoundType}

中缀类型T1 op T2由一个中缀运算符组成,该运算符op应用于两个类型操作数T1T2. 该类型等价于应用程序类型op[T1,T2]。中缀运算符op可以是任意标识符。

所有类型中缀运算符具有相同的优先级;括号必须用于分组。类型运算符的结合性与术语运算符一样确定:以冒号 ':' 结尾的类型运算符是右结合的;所有其他运算符都是左结合的。

在一系列连续的类型中缀运算t0 op t1 op2 … opn tn中,所有运算符op1,…,opn必须具有相同的结合性。如果它们都是左结合的,则序列被解释为(…(t0 op1 t1) op2…) opn tn,否则被解释为t0 op1 (t1 op2 (…opn tn)…)

于 2015-08-24T08:52:26.367 回答