Cow*_*ris 2 oop polymorphism scala
在最近的工作表中,我遇到了一个问题,询问以下代码的输出:
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 <: AnyInt是Any的子类?
稍后运行代码片段时,给出的结果只是打印"1".这不是我所预期的要求obj.m(2.3)解决的问题def m(x: any),实际上编译器似乎进入A并调用了min class A.
后来的表述,obj2.m(4)并obj2.m(5.6)似乎很有道理既是4和5.6与功能将土地def m(x: Double),因此不显示任何信息了.
编译器以什么顺序遍历以查找要调用的内容?如果有人能够清除我对Scala如何处理多态性的困惑,我将非常感激,非常感谢:)
执行此操作时class B[Any],您将定义一个名为类型参数的类Any.不要将类型参数名称与实际类混淆Any.你只是在暗示它的名字.
你可以这样做:
class B[Int]
val obj = new B[String]
您可能会发现为什么在实际类型之后命名类型参数是不好的做法.通常,人们使用单个字母名称作为其类型参数,如下所示:
class B[T] // I just changed the name of the type parameter from "Int" to "T".
val obj = new B[String]