我想要2个类似的功能:
fun f1(String key, value: JsonNullable<ByteArray?>): Modification? {
return if (value.isPresent) {
when (val rawValue = value.get()) {
null -> delete(key)
else -> bar(field, rawValue)
}
} else {
null
}
}
==============
fun f2(String key, value: JsonNullable<String?>): Modification? {
return if (value.isPresent) {
when (val rawValue = value.get()) {
null -> delete(key)
else -> bar(field, rawValue)
}
} else {
null
}
}
有没有办法使用泛型将其替换为单个函数?
bar 函数重载:
fun bar(field: String, value: JsonNullable<ByteArray?>)...
fun bar(field: String, value: JsonNullable<String?>)...
我认为您的想法是错误的,String 不是从 ByteArray 继承的(反之亦然),并且它们不从除 Object 之外的任何基类继承。
上限 最常见的约束类型是上限,它对应于 Java 的 extends 关键字:
因此,除非您只想将其扩展为对象(字符串和 ByteArray 都扩展对象),否则您将需要使用泛型。
我想这个例子会让你有一个基本的了解
基本上,您使用泛型,然后使用 if 或 switch 语句来执行每种类型特定的操作。
在使用对象上限的情况下,它将是 这些
因此,如果这不能回答您的问题,您可能应该重新措辞,使其更准确地说明您正在寻找的内容。
公平警告...Java/Scala 开发人员很少使用 Kotlin,因此有些内容可能过于冗长
另外,如果您只想接受 ByteArray 或 String,您可以这样做...
sealed class JsonType {
data class JsonString(val value: String) : JsonType()
data class JsonByteArray(val value: ByteArray) : JsonType()
}
data class JsonNullable<T>(val value: T?)
fun f2(key: String, value: JsonNullable<JsonType>?): String? {
when (val jsonType = value?.value) {
is JsonType.JsonString -> {
println("Welp it is String: ${jsonType.value}")
}
is JsonType.JsonByteArray -> {
println("Welp it is Byte: ${String(jsonType.value)}")
}
null -> {
println("JSON is null")
}
else -> {
println("Unknown JSON type")
}
}
return null
}
/**
* You can edit, run, and share this code.
* play.kotlinlang.org
*/
fun main() {
f2("null", null)
f2("String", JsonNullable(JsonType.JsonString("String Value")))
f2("Byte", JsonNullable(JsonType.JsonByteArray("Byte Value".toByteArray())))
f2("Null JSON", JsonNullable(null))
}