处理函数声明中不同数据类型的多个上界的方法

时间:2018-03-12 16:25:08

标签: generics recursion kotlin projection

我有一个尾递归函数,可以在其中创建嵌套列表,其中传递的参数是链接的hashmap,最初的类型为:

val mapTest = LinkedHashMap<String, Any>()

因此,对递归的调用是

matchTest(mapTest)

我的尾递归解构了地图并做了一堆模式匹配。为简单起见,它是:

tailrec fun <T> matchTest(testMap: Map<T,Any>): Boolean
    where T: String, // this is string on initial call
          T: List<String>{ // this is List<String> on subsequent calls

    val newMap = LinkedHashMap<List<String>, Any>()
    var found = false

    /*
        logic that can create nested lists
    */

    return when {
        found -> true
        else -> matchTest(newMap)
    }

}

问题在于,在初始调用之后进行递归调用时,它不会传递一个String类型的LinkedHashMap,而是List类型String }。

天真地,我认为在我的Generic类型上创建多个上界会处理这个(参见上面的函数声明),但是Idea给出的错误是&#34; String不是List&#34的子类型; ...

我也尝试使用星形投影作为列表参数,但是Idea给了我一个错误&#34;不允许在函数和属性的类型参数上进行预测。&#34;

我咆哮着错误的树,以为使用通用数据类型可以解决我如何处理地图中的密钥可以从String转到List<String>?的问题

在Python中,当然这很简单,但唉......

0 个答案:

没有答案