我遇到过这个新的方法定义。需要解释这里到底发生了什么。
父母特质
sealed trait Generic{
def name : String = name // what is the body of this function call?
def id : Int = id
def place : String = place
}
儿童案例类
case class Capital(
countryName : String,
override val id: Int,
override val place:String
) extends Generic
warning: method place in trait Generic does nothing other than call itself recursively
我收到此警告信息,使用这些类型的方法有什么不对吗?def name : String = name
?答案 0 :(得分:0)
好的,所以在你的trait
中通过递归定义方法体。意味着这些方法,如果不被覆盖(并且它们不应该以某种方式定义它们),将递归调用自身直到StackOverflowError
发生。例如,您没有覆盖name
中的Capital
方法,因此在这种情况下,您会在运行时获得StackOverflowError
:
val c = Capital("countryName", 1, "place")
c.name
所以,你被警告,你有递归定义。特性是sealed
,所以至少它不能在其他地方被覆盖,但无论如何,这样的定义就像是在你的道路上放置地雷并依靠你的记忆,你不会忘记它们(其他任何人都会要小心,在扩展之前检查trait
定义
答案 1 :(得分:0)
您在特征中提供了无限循环的默认实现,非常类似于以下示例:
def infiniteLoop: Unit = infiniteLoop
这可以说是你可能放在特征方法中的最无用和最危险的代码。你只能通过使它变得不确定而使它变得更糟。幸运的是,编译器会给你一个非常明确和准确的警告:
警告:特征中的方法位置Generic除递归调用本身外什么都不做
=
- 符号后面。在你的情况下,省略了函数体周围常见的花括号,整个函数体只包含对它自身的递归调用。如果您不希望有任何不必要的无限循环,只需将方法保持未实现状态:
sealed trait Generic{
def name: String
def id: Int
def place: String
}
这还有一个额外的好处,即如果您忘记在子类中实现这些方法之一,编译器可以发出警告。