Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics kotlin:typealias类型参数上不允许有边界_Generics_Kotlin - Fatal编程技术网

Generics kotlin:typealias类型参数上不允许有边界

Generics kotlin:typealias类型参数上不允许有边界,generics,kotlin,Generics,Kotlin,我正在尝试以下类型: typealias Graph<T:Comparable<T>> = Map<T, List<T>> 我得到一个错误,说typealias’ed类型上不允许边界 如何解决这个问题?我不太清楚您想做什么,但是如果您想要一种方法来约束可以传递或存储在属性中的映射类型,这是我能想到的最简单的方法。创建一个委托给映射的包装器类,以便它可以成为映射本身: class Graph<T: Comparable<T>&

我正在尝试以下类型:


typealias Graph<T:Comparable<T>> = Map<T, List<T>>

我得到一个错误,说typealias’ed类型上不允许边界


如何解决这个问题?

我不太清楚您想做什么,但是如果您想要一种方法来约束可以传递或存储在属性中的映射类型,这是我能想到的最简单的方法。创建一个委托给映射的包装器类,以便它可以成为映射本身:

class Graph<T: Comparable<T>> (private val map: Map<T, List<T>>): Map<T, List<T>> by map {
    override fun toString() = map.toString()
    // You can use the IDE to generate equals and hashcode out of the map property
}
您还可以使用一些功能来熟悉用法:

fun <T:Comparable<T>> graphOf(): Graph<T> = Graph(emptyMap())
fun <T:Comparable<T>> graphOf(pair: Pair<T, List<T>>): Graph<T> = Graph(mapOf(pair))
fun <T:Comparable<T>> graphOf(vararg pairs: Pair<T, List<T>>): Graph<T> = Graph(mapOf(*pairs))
用法:

val graph: Graph<String> = graphOf("x" to listOf("y", "z"))
如果typealias可以做到这一点,那么它就没有typealias那么好了,因为您必须始终包装一个映射才能将其作为图形传递。您还可以创建一个方便的函数,用于包装贴图,以便在将其作为参数传递时使用:

fun <T:Comparable<T>> Map<T, List<T>>.toGraph(): Graph<T> = 
        if (this is Graph) this else Graph(this)

我建议不要依赖IDE生成的equals,因为它违反了Map.equals契约,根据该契约,如果映射表示相同的映射,那么映射是相等的。考虑手动实现相等:超越乐趣均等:任何?=?这个===other | | other是图形&&map==other.map | | map==other你说得对。IDE版本将坚持类类型匹配。Hashcode应该是map.Hashcode我不明白。equals契约中的类类型匹配有什么问题?如果实现映射的不同类包含相同的内容,则它们应该是相等的,即使它们不是同一个类。如果使用IDE的功能生成equals函数,它将只声明同一类的成员为equal。