Scala 为什么要编译此文件以及发生了什么?

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

我正在编写一个包装器类,它以相同的方式将大多数调用传递给根对象,我无意中留下了完整的定义(参数名为x等),请参见下文。令我惊讶的是,它被编译了。这是怎么回事?这类似于分配给root.p\u吗?我觉得奇怪的是,我可以把“x”这个名字留在助理中。另外,传递包装好的呼叫的最佳(最快)方式是什么?或者,可能没有什么区别

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
的其他版本


您可以查看该答案以了解更多详细信息:

谢谢,我的示例只是为了演示一段更大的代码。