override基类的field可能导致constructor出现问题
scala吧
全部回复
仅看楼主
level 1
AhsokaTano 楼主
scala类定义不但是声明了各个field和方法,还是一个构造函数。这就会导致子类override field影响到基类的构造函数问题。比如
class a{
var m: List[Int] = List(0);
println(m.mkString(","));
}
这是完全没有问题的,构造类a的instance时都会打印 list(0)
但加上下面这个子类之后
class b extends a {
override m : List[Int] = List(1,2);
println(m);
}
a的构造函数依然会运行(scala 3.2.2) 但此时m对应一个空指针,println这一步会报错。
2023年02月16日 03点02分 1
level 9
水
2023年03月08日 05点03分 2
[滑稽]
2023年05月19日 03点05分
level 1
AhsokaTano 楼主
我都搞不清上面想说什么了。重写一遍:
下面代码可以正常运行:
class a {
def m = List(1,2,3)
println("class a report " + m.mkString )
}
class b extends a {
override def m = List(4)
println("class b report " +m )
}
@main
def main(): Unit = {
println("Hello world!")
var obj = new a
var obj2 = new b
}
/×
Hello world!
class a report 123
class a report 4
class b report List(4)
×/
下面代码在b中修改了基类的m的类型, 导致出错:
scalac: Error: 'java.lang.String dotty.tools.dotc.reporting.Message.msg()'
java.lang.NoSuchMethodError: 'java.lang.String dotty.tools.dotc.reporting.Message.msg()'
class a {
def m = List(1,2,3)
println("class a report " + m.mkString ) // m的定义被修改成int没有mkString方法了。
}
class b extends a {
override def m = 4
println("class b report " +m )
}
@main
def main(): Unit = {
println("Hello world!")
var obj = new a
var obj2 = new b
}
2023年07月11日 02点07分 3
1