Scala 为什么要编译此文件以及发生了什么?
我正在编写一个包装器类,它以相同的方式将大多数调用传递给根对象,我无意中留下了完整的定义(参数名为x等),请参见下文。令我惊讶的是,它被编译了。这是怎么回事?这类似于分配给root.p\u吗?我觉得奇怪的是,我可以把“x”这个名字留在助理中。另外,传递包装好的呼叫的最佳(最快)方式是什么?或者,可能没有什么区别Scala 为什么要编译此文件以及发生了什么?,scala,Scala,我正在编写一个包装器类,它以相同的方式将大多数调用传递给根对象,我无意中留下了完整的定义(参数名为x等),请参见下文。令我惊讶的是,它被编译了。这是怎么回事?这类似于分配给root.p\u吗?我觉得奇怪的是,我可以把“x”这个名字留在助理中。另外,传递包装好的呼叫的最佳(最快)方式是什么?或者,可能没有什么区别 trait A { def p(x:Int) = println("A"+123) } case class B(root:A) { def p(x: Int): Unit
trait A {
def p(x:Int) = println("A"+123)
}
case class B(root:A) {
def p(x: Int): Unit = root.p(x:Int) // WHAT HAPPENED HERE?
}
object Test extends App {
val temp = new A{}
val b = B(temp)
b.p(123)
}
您是否将
B.p
的实施委托给A.p
除了root.p(x:Int)
,我没有看到任何异常,您可以通过root.p(x)
保存键入内容
trait是代码混合的一种方式,我认为最简单的方式是:
trait A {
def p(x: Int) = println("A" + x)
}
case class B extends AnyRef with A
val b = B()
b.p(123)
发生的是类型归属,在这里,它并不多 代码的工作原理与您编写的代码相同
def p(x: Int): Unit = root.p(x)
如你所愿。当您在调用中写入x:Int
时(不是在声明中,在声明中它有完全不同的含义),或者更一般的expr:Type
,它的值与expr
相同,但它告诉编译器检查expr是否属于给定的类型(这是一个编译类型的检查,有点向上转换,而不是运行时检查,例如asInstanceOf[…]
),并且要处理它,必须具有该类型。这里,x确实是一个Int,并且编译器已经将其视为Int,因此属性没有任何变化
除了记录代码中某个不明显的类型外,还可以使用类型归属在重载方法之间进行选择:
def f(a: Any) ...
def f(i: Int) ...
f(3) // calls f(i: Int)
f(3: Any) // calls f(a: Any)
请注意,在第二次调用中,使用属性,编译器知道3
的类型为Any
,精度低于Int
,但仍然为真。否则这将是一个错误,这不是强制转换。但属性使它调用f
的其他版本
您可以查看该答案以了解更多详细信息:谢谢,我的示例只是为了演示一段更大的代码。