상위 유형 바인드가있는 유형 및 매개 변수화 된 유형을 사용하여 문제점이 발생했습니다. Scala 컴파일러는 DefaultEdge
유형을 찾고 있지만 Edge[Type]
을 필요로한다고 알려줍니다. 내가 case DefaultEdge[Type]
같은 것을 사용했지만 구문 오류가 발생합니다.상위 유형 바인드가있는 케이스 클래스
여기가 나의 설정입니다. 나는 서로 다른 타입에 대응하는 두 개의 엣지 케이스 클래스를 가지고있다. 이러한 클래스는 그럼 난 방법 중 몇 가지를 정의 GraphLike
라는 특성을 가지고있는 파라미터 화 된 형태의 V.
object EdgeKind extends Enumeration {
type EdgeKind = Value
val Default, Jump, True, False, DefaultCase, Case, Throw, Return = Value
}
sealed abstract class Edge[V <: VertexLike](val startVertex: V, val endVertex: V, val kind: EdgeKind.EdgeKind)
case class DefaultEdge[V <: VertexLike](override val startVertex: V, override val endVertex: V)
extends Edge[V](startVertex, endVertex, EdgeKind.Default)
case class JumpEdge[V <: VertexLike](//...
가 포함되어 있습니다. 일부 GraphLike
특성의 방법과는 GraphLikeWithAdjacencyMatrix
라고
trait GraphLike[V <: VertexLike] {
protected type E <: Edge[V]
}
또 다른 특성 구현 사이에서 : 유일한 흥미로운 부분이 하나 여야합니다. 모든 것을 함께 연결하면 다음과 같은 클래스를 갖게됩니다.
class CFG extends GraphLikeWithAdjacencyMatrix[BasicBlockVertex] {
def dotExport = {
def vertexToString(vertex: BasicBlockVertex) = ""
def edgeToString(edge: E) = edge match {//also tried Edge[BasicBlockVertex] here
case DefaultEdge => error("CFG may not contain default edges.")
case JumpEdge => "jump"
case TrueEdge => "true"
case FalseEdge => "false"
case DefaultCaseEdge => "default"
case CaseEdge => "case"
case ThrowEdge => "throw"
case ReturnEdge => "return"
}
new DOTExport(this, vertexToString, edgeToString)
}
}
여기에는 문제가 발생합니다. Edge [BasicBlockVertex]가 예상되며 DefaultEdge 만 제공한다고 들었습니다. DOTExport의 정의는 class DOTExport[V <: VertexLike](val graph: GraphLike[V], val vertexToString: V => String, val edgeToString: Edge[V] => String)
입니다. 제 질문은 이제 어떻게 가장자리 유형에 대한 사례 클래스를 사용하여 컴파일러를 행복하게 만들 수 있습니까? 내 멍청한 실수 야. 나는 가장자리 [가?] 필요하기 때문에 DefaultEdge(x,y)
대신 DefaultCase
등의 그러나 다음 DOTExport의 인스턴스가 실패 할 말을 한 번 그런데
으로 경기-코드가 작동하고 나는
감사합니다 CFG.E에게 전달합니다!
편집 : 사실 GraphLike에서 E = Edge[V]
의 조합 DefaultEdge(_, _)
작품을 사용. 불행히도 이것은 시도와 오류의 결과 일뿐입니다. 나는 그것이 지금 왜 효과가 있는지 정말로 알고 싶다.
오류 메시지 : 여기
(fragment of test.scala):25: error:
type mismatch; found :
(Graph.this.E) => java.lang.String
required: (this.Edge[?]) => String
new DOTExport(this, (vertex: V) => vertex.toString, edgeToString)
내 문제를 설명 전체 컴파일 가능한 코드입니다. 다시, 제 문제는 라인 14입니다. 왜냐하면 type E <: Edge[V]
을 type E = Edge[V]
으로 바꿀 때 모든 것이 작동하기 때문에 나는 그 이유를 모릅니다.
object EdgeKind {
val Default = 0
val Jump = 1
}
abstract class Edge[V <: VertexLike](val startVertex: V, val endVertex: V, val kind: Int)
case class DefaultEdge[V <: VertexLike](override val startVertex: V, override val endVertex: V) extends Edge[V](startVertex, endVertex, EdgeKind.Default)
case class JumpEdge[V <: VertexLike](override val startVertex: V, override val endVertex: V) extends Edge[V](startVertex, endVertex, EdgeKind.Jump)
trait VertexLike
trait GraphLike[V <: VertexLike] {
protected type E <: Edge[V] // Everything works when E = Edge[V]
}
class DOTExport[V <: VertexLike](val graph: GraphLike[V], val vertexToString: V => String, val edgeToString: Edge[V] => String)
class Graph[V <: VertexLike] extends GraphLike[V] {
def dotExport = {
def edgeToString(edge: E) = edge match {
case DefaultEdge(_, _) => ""
case JumpEdge(_, _) => "jump"
}
new DOTExport(this, (vertex: V) => vertex.toString, edgeToString)
}
}
컴파일 가능한 코드를 제공하면 도움이 될 것입니다. 또한 실제로 발생하는 줄에서 정확한 줄과 위치의 표시를 포함하여 실제 오류 메시지를 제공하면 실제로는 도움이 될 것입니다. –