gpt4 book ai didi

scala - 创建 Scala 类的好方法,其类型参数取决于组合对象类型

转载 作者:行者123 更新时间:2023-12-02 02:03:18 24 4
gpt4 key购买 nike

我正在磨练我的 Scala 技能,并且正在编写一些图形算法。我有一个图形的 API 表示,类似于这样

trait GraphLike[T]
{
val vertices: Map[ T, VertexLike[T] ]
def addVertex( t: T ): GraphLike[T]
def addEdge( a:T, b:T ): GraphLike[T]
def getAdjacencyList( a: T ): List[T]
def getVertex( a: T ): VertexLike[T]
...
}

然后我有另一个类:

class DepthFirstSearch[ T ]( val graph: GraphLike[T], val sourceVertex: T )
{
...
}

目前我发现我必须这样做才能创建 DepthFirstSearch 类的实例

val dfs = new DepthFirstSearch[Integer]( new UnDirGraph[Integer](/*some params*/), 1 )

其中 UnDirGraph 是一个 GraphLike 子类

我必须在 new DepthFirstSearch[Integer] 中指定类型参数。有没有一种方法可以让类型检查器从提供的图形参数中推断出这一点。我发现我做不到做这样的事情

val dfs = new DepthFirstSearch( new UnDirGraph[Integer](/*some params*/), 1 )

目前上面的方法失败了......有没有办法可以完成上面的事情?

编辑:所以我得到的错误信息是 类型不匹配;发现:com.KGraph.GraphLike[整数]
必需:com.KGraph.GraphLike[任何] 注意:Integer <: Any,但是 trait GraphLike 是不变的 在类型 T 中。您可能希望将 T 定义为 +T。 (SLS 4.5)

这就是我尝试创造的方式

val graph = Graphing.createUndiGraphFromFile( 
new File("/Volumes/Data/Users/kartik/ScalaSpace/Graph/tinyG.txt" ) )
val dfs = new DepthFirstSearch( graph, 0 )

其中 crateUndiGraphFromFile 返回一个 GraphLike[Integer]

最佳答案

感谢@Régis Jean-Gilles 和@Mark Peters

Integer1(Int 类型)的通用父类(super class)型是Any。所以在写这个的时候:

val dfs = new DepthFirstSearch( new UnDirGraph[Integer](/*some params*/), 1 )

类型推断给你

val dfs = new DepthFirstSearch[Any]( new UnDirGraph[Integer](/*some params*/), 1 )

但是现在,我们需要

new UnDirGraph[Integer](/*some params*/) <: UniDirGraph[Any]

事实并非如此,因为 UnDirGraph 是不变的。

如果你写:

val dfs = new DepthFirstSearch[Integer]( new UnDirGraph[Integer](/*some params*/), 1 )

Scala 会将 1 隐式转换为 Integer,然后一切正常。

正如@Régis Jean-Gilles 指出的那样,以下方法将起作用:

val dfs = new DepthFirstSearch( new UnDirGraph[Int](/*some params*/), 1 )

关于scala - 创建 Scala 类的好方法,其类型参数取决于组合对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16151591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com