【发布时间】:2017-06-01 18:43:27
【问题描述】:
在最近的工作表中,有人问我以下代码的输出是什么:
class A { def m(x:Double) = x+x }
class B[Any] extends A{ def m(x: Any) = print(x) }
class C[Any] { def m (x:Double) = x+x; def m (x: Any) = print(x) }
val obj1 = new B[Int]; val obj2 = new C[Any]
obj1.m(1); obj1.m(2.3); obj2.m(4); obj2.m(5.6)
对于类名后面的方括号中的具体类型意味着什么(即class B[Any]),我感到很困惑。后面的表达式val obj1 = new B[Int] 是否有效,因为Int <: Any, Int 是 Any 的子类?
稍后运行代码 sn-p 时,给出的结果只是打印了“1”。这不是我预期对obj.m(2.3) 的调用在def m(x: any) 处解析的结果,实际上编译器似乎上升到A 并在class A 中调用m。
后面的表达式,obj2.m(4) 和 obj2.m(5.6) 似乎是有意义的,因为 4 和 5.6 都会以 def m(x: Double) 出现在函数中,因此不会打印任何内容。
编译器究竟以什么顺序遍历来查找要调用的内容?如果有人能解决我对 Scala 如何处理多态性的困惑,我将不胜感激,非常感谢:)
【问题讨论】:
标签: scala oop polymorphism