类线性化在标量2.13中不起作用



我正在尝试将scala 2.12升级到scala 2.13.5

类线性化对我来说并不正常,IntelliJ和Scala编译器会抛出一个错误,但理想情况下它应该可以工作。下面是问题。

trait A[E] {
def getObject: E = {
// some implementation
}
}
abstract class B[T](e: Object) {
def getObject: T = {
// some implemntation
}
}
class C[T] extends B[T](null) with A[String] {

def myMethod(): Unit = {
println(this.getObject.someMethodWhichIsNotInStringClassButAvailableInTClass)
}
}

在上面的示例程序中,this.getObject也来自A,我希望它来自B。看来我的理解是错误的。但需要详细理解这类线性化问题。

由于上述问题,我的代码没有编译,因为所需的方法在String类中不可用。

同样的代码使用scala 2.12编译,但不使用scala 2.13.5。

另一个参考-https://stackoverflow.com/a/49832570/819866

这根本不应该编译。。。对我来说确实不是(2.13.1(:

error: class C inherits conflicting members:
def getObject: T (defined in trait B) and
def getObject: String (defined in trait A)
(note: this can be resolved by declaring an `override` in class C.)

不能继承具有相同名称的不同方法。

此外,如果您的继承实际上是有效的,那么线性化仍然可以从左到右工作:

trait A { def foo: Sting }
trait B extends A { def foo = "b" }
trait C extends A { def foo = "c" }
class D extends B with C
println(new D().foo)

这打印出";c";。

最新更新