https://kotlinlang.org logo
#getting-started
Title
# getting-started
s

supra

02/04/2021, 7:50 AM
Copy code
private fun transformDepsRecursively(target: Project, from: Map<*, *>, to: MutableMap<*, *>) {
    log.quiet("$TAG transformDepsRecursion start")
    from.forEach {
        val valueFrom = it.value
        var valueTo = valueFrom;
        if (valueFrom is ProjectDescriptor) {
            valueTo = target.project(valueFrom.path)
        } else if (valueFrom is Map<*, *>) {
            valueTo = mutableMapOf<String, Any>()
            transformDepsRecursively(target, valueFrom, valueTo)
        }
        mapOf<Any,Any>()
        to[it.key]=valueTo
    }
    log.quiet("$TAG transformDepsRecursion end")
}
a

Albert Chang

02/04/2021, 10:36 AM
*
can represents any type and there isn't any restriction so under your current function signature, this is possible, for example:
Copy code
transformDepsRecursively(target, mapOf<Int, Int>(), mutableMapOf<String, String>())
But of course you can't put int values into a map of strings. This is the reason of the error.
This should work.
s

supra

02/04/2021, 11:41 AM
@Albert Chang BIG THANKS for your help, it work with little modify like this:
Copy code
private fun transformDeps(target: Project): Map<String, Any?> {
    <http://log.info|log.info>("$TAG transformDeps start")
    val deps = mutableMapOf<String, Any?>()
    transformDepsRecursively(target, Nest.dependens, deps)
    <http://log.info|log.info>("$TAG transformDeps end from size(${Nest.dependens.size}) to size(${deps.size})")
    return deps
}

private fun <K> transformDepsRecursively(target: Project, from: Map<out K, Any?>, to: MutableMap<in K, Any?>) {
    <http://log.info|log.info>("$TAG transformDepsRecursively start from.size(${from.size} to.size(${to.size}))")
    from.forEach {
        val valueFrom = it.value
        var valueTo = valueFrom;
        <http://log.info|log.info>("$TAG transformDepsRecursively for key = ${it.key} with value type ${valueFrom?.javaClass}")
        log.debug("$TAG transformDepsRecursively valueFrom = ${valueFrom}")
        if (valueFrom is ProjectDescriptor) {
            valueTo = target.project(valueFrom.path)
        } else if (valueFrom is Map<*, *>) {
            valueTo = mutableMapOf<Any?, Any?>()
            transformDepsRecursively(target, valueFrom , valueTo)
        }
        log.debug("$TAG transformDepsRecursively valueTo = ${valueTo}")
        to[it.key] = valueTo
    }
    <http://log.info|log.info>("$TAG transformDepsRecursively end")
}
2 Views