我有一个特点,要求Graphlike
作为图表工作的东西。值得注意的是,我想要的属性之一是该方法g.subgraph(Set(1, 2, 3))
将返回一个仅具有顶点 1、2 和 3 的相同类型的子图。显然,这意味着我想要 F 有界多态性,Graphlike
看起来像这样:
trait Graphlike[A <: Graphlike[A]] {
type Vertex
def subgraph(selectedVertices: Set[Vertex]): A
}
我还有一个特征,它代表一个自动机,它具有关联的边和顶点类型。我希望它表现得像一个图表。简化后,它看起来像这样:
trait Automaton extends Graphlike[Automaton] {
type State
type Vertex = State
def states: Iterable[State]
def initialState: State
}
这几乎可以工作。但是,当我尝试将两者混合并对结果做一些有用的事情时,Scala 的类型系统会感到困惑:
class UsesAutomataAsGraphs(val aut: Automaton with Graphlike[Automaton]) {
aut.subgraph(Set(aut.initialState)).subgraph(Set(aut.initialState))
}
给出如下错误:
[info] Compiling 1 Scala source to /Users/albin/Downloads/example/target/scala-2.12/classes ...
[error] /Users/albin/Downloads/example/src/main/scala/example/Example.scala:21:56: type mismatch;
[error] found : UsesAutomataAsGraphs.this.aut.State
[error] required: _1.State where val _1: Automaton
[error] aut.subgraph(Set(aut.initialState)).subgraph(Set(aut.initialState))
我如何让 Scala 理解这两种关联类型在所有派生对象中都是相同的?