我正在尝试将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";。