在 Kotlin 中与嵌套 class 共享泛型
Share generic type with nested class in Kotlin
我正在尝试用通用类型的节点做一个简单的 Dijkstra 探路者。
为此,我有探路者 class 和嵌套数据 class 来帮忙。
看起来像这样
class Dijkstra<T, U: Number >( val graph: Graph<T, U>,
val from: Node<T, U>,
val to: Node<T, U>) {
private var nodesDistances = mutableMapOf<Node<T, U>, DijkstraDistanceHelper<T, U>>()
init {
graph.getNodeList().forEach { nodesDistances[it] = DijkstraDistanceHelper<T, U>(it, null, null) }
val currentNode = from
while (currentNode != to) {
currentNode.getNeighborhood()?.forEach {
if (it.destination != currentNode) {
//it.value type is U and properly recognized as such
val currentDistance = it.value + (nodesDistances[currentNode]!!.distance ?: 0)
if (nodesDistances[it.destination]?.distance == null
|| nodesDistances[it.destination]!!.distance!! > currentDistance) {
//compilator error on the compare too, same reason I assume
nodesDistances[it.destination]!!.distance = currentDistance
nodesDistances[it.destination]!!.parentNode = currentNode
}
}
}
}
}
private data class DijkstraDistanceHelper<T, U: Number>( val node: Node<T, U>,
var distance: U?,
var parentNode: Node<T, U>?)
}
从算法上讲这并不合理,但令我困扰的是它无法编译:编译器无法理解 Dijkstra 的 U 泛型类型与 DijkstraDistanceHelper 相同
是不是方法不对?我如何强制 Dijkstra 的泛型类型(T 和 U)与 DijkstraDistanceHelper 相同?
无法添加抽象 Number
实例。如果您查看文档,您会发现没有定义 plus
运算符。这是因为添加数字有不同的行为,具体取决于它们是否是浮点数和它们的内部大小。
您需要提供添加 U
实例的方法,例如 (U,U) -> U
作为参数,可以在创建期间作为 Int::plus
或其等价物提供。
我正在尝试用通用类型的节点做一个简单的 Dijkstra 探路者。 为此,我有探路者 class 和嵌套数据 class 来帮忙。 看起来像这样
class Dijkstra<T, U: Number >( val graph: Graph<T, U>,
val from: Node<T, U>,
val to: Node<T, U>) {
private var nodesDistances = mutableMapOf<Node<T, U>, DijkstraDistanceHelper<T, U>>()
init {
graph.getNodeList().forEach { nodesDistances[it] = DijkstraDistanceHelper<T, U>(it, null, null) }
val currentNode = from
while (currentNode != to) {
currentNode.getNeighborhood()?.forEach {
if (it.destination != currentNode) {
//it.value type is U and properly recognized as such
val currentDistance = it.value + (nodesDistances[currentNode]!!.distance ?: 0)
if (nodesDistances[it.destination]?.distance == null
|| nodesDistances[it.destination]!!.distance!! > currentDistance) {
//compilator error on the compare too, same reason I assume
nodesDistances[it.destination]!!.distance = currentDistance
nodesDistances[it.destination]!!.parentNode = currentNode
}
}
}
}
}
private data class DijkstraDistanceHelper<T, U: Number>( val node: Node<T, U>,
var distance: U?,
var parentNode: Node<T, U>?)
}
从算法上讲这并不合理,但令我困扰的是它无法编译:编译器无法理解 Dijkstra 的 U 泛型类型与 DijkstraDistanceHelper 相同
是不是方法不对?我如何强制 Dijkstra 的泛型类型(T 和 U)与 DijkstraDistanceHelper 相同?
无法添加抽象 Number
实例。如果您查看文档,您会发现没有定义 plus
运算符。这是因为添加数字有不同的行为,具体取决于它们是否是浮点数和它们的内部大小。
您需要提供添加 U
实例的方法,例如 (U,U) -> U
作为参数,可以在创建期间作为 Int::plus
或其等价物提供。