可能重复:
What do <:<, <%<, and =:= mean in Scala 2.8, and where are they documented?
我不明白=:= [A,B]代表什么以及它如何有用。我做了一些研究,但很难找到没有字母字符的东西。有人能帮我一个真实的例子吗?
答案 0 :(得分:11)
从Scala 2.8开始,通过广义类型约束类为参数化类型提供了更多约束功能。这些类使得方法能够进一步专业化,并补充上下文边界,如下所示:
A =:= B断言A和B必须相等
A&lt;:&lt; B断言A必须是B的子类型
这些类的示例用法是实现在集合中添加数字元素的专门化,或用于定制的打印格式,或允许针对交易者投资组合中的特定投注或基金类型进行定制的负债计算。例如:
case class PrintFormatter[T](item : T) {
def formatString(implicit evidence: T =:= String) = { // Will only work for String PrintFormatters
println("STRING specialised printformatting...")
}
def formatPrimitive(implicit evidence: T <:< AnyVal) = { // Will only work for Primitive PrintFormatters
println("WRAPPED PRIMITIVE specialised printformatting...")
}
}
val stringPrintFormatter = PrintFormatter("String to format...")
stringPrintFormatter formatString
// stringPrintFormatter formatPrimitive // Will not compile due to type mismatch
val intPrintFormatter = PrintFormatter(123)
intPrintFormatter formatPrimitive
// intPrintFormatter formatString // Will not compile due to type mismatch
您可以在此处找到有关Scala类型的完整简短课程:http://scalabound.org/?p=323
答案 1 :(得分:4)
=:=[A,B]
类是A
和B
同一类的证据。参见例如http://apocalisp.wordpress.com/2010/06/10/type-level-programming-in-scala-part-2-implicitly-and/获得解释。
很难找到一些例子。这是一些代码:
答案 2 :(得分:0)
最好的办法是查看Predef的来源。在那里你找到了:
object =:= {
implicit def tpEquals[A]: A =:= A = new (A =:= A) {def apply(x: A) = x}
}
因此,如果A和B属于同一类型,则A =:= B类型的对象仅可隐式使用。