我无法弄清楚此代码的工作原理?
class Node[TypeOne <: Node[TypeOne]] {
var x: TypeOne = _
}
object Tree extends App {
val treeNode = new Node[String]
treeNode.x = "ten"
//treeNode.x = new TreeNode[String]
}
最初我认为签名类Node [TypeOne&lt;:Node [TypeOne]]意味着像TypeOne类型的x这样的变量必须是Node类型或它的子类,但它似乎是因为我可以创建Node [String]和Node [Int]类型的val treeNode,所以不是这样。那么签名是做什么的呢?
答案 0 :(得分:3)
此模式通常用于想要静态了解其具体子类型的基类或特征。最有可能的是,图书馆设计师希望您扩展Node
:
class MyNode extends Node[MyNode]
然后直接使用MyNode
代替Node
。
答案 1 :(得分:3)
这在scala中被称为“f有界多态”。那里有很多关于它的信息,所以不要试图在这里列举所有这些,我只是分享一些有用的链接: