【发布时间】:2020-05-22 12:12:21
【问题描述】:
我正在研究一个名为 Graphlike 的图形特征,我在其中使用依赖/关联类型作为顶点。在solving my polymorphism issues 之后,我的实现如下所示:
trait Graphlike {
type Vertex
def subgraph(selectedVertices: Set[Vertex]): this.type
}
我还有各种抽象的原子状态自动机,它们的行为当然像图:
trait Automaton extends Graphlike {
type State
type Vertex = State
def states: Iterable[State]
def initialState: State
def getBuilder: AutomatonBuilder[this.type]
def subgraph(selectedVertices: Set[Vertex]) = {
val builder = getBuilder
// Some logic to actually do something to the builder here
builder.getAutomaton
}
}
trait AutomatonBuilder[A <: Automaton] {
def getAutomaton: A
}
但是,当我尝试实际实现一个具体的自动机时,我遇到了麻烦:
class ConcreteAutomaton extends Automaton {
type State = Int
def states = List(1, 2, 3)
def initialState = 1
def getBuilder = new ConcreteAutomatonBuilder
}
class ConcreteAutomatonBuilder extends AutomatonBuilder[ConcreteAutomaton] {
def getAutomaton = new ConcreteAutomaton
}
class UsesAutomataAsGraphs {
val aut = new ConcreteAutomaton
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:33:20: type mismatch;
[error] found : ConcreteAutomatonBuilder
[error] required: AutomatonBuilder[ConcreteAutomaton.this.type]
[error] Note: ConcreteAutomaton >: ConcreteAutomaton.this.type (and ConcreteAutomatonBuilder <: AutomatonBuilder[ConcreteAutomaton]), but trait AutomatonBuilder is invariant in type A.
[error] You may wish to define A as -A instead. (SLS 4.5)
[error] def getBuilder = new ConcreteAutomatonBuilder
[error] ^
遵循建议并制作 A 逆变器会给我带来其他问题。这也不是我真正想要的。我想要我的建造者生产完全相同类型的自动机。
【问题讨论】:
-
this.type指的是当前实例的单例类型。您不能创建与当前实例相同类型的新实例。您可以使用 F-Bounded 或 typeclasses 解决您想做的事情,看看this -
谢谢;这就是我最初的想法,但我想我现在可能有一些可以工作的东西。如果我让它在真实世界的代码上工作,我会添加它作为回复。
标签: scala polymorphism builder