在 Kotlin 中,有没有办法定义泛型参数,当它们不扩展公共基类(String/ByteArray)时只能是某些类型?

问题描述 投票:0回答:1

我想要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?>)...
kotlin generics overloading
1个回答
0
投票

我认为您的想法是错误的,String 不是从 ByteArray 继承的(反之亦然),并且它们不从除 Object 之外的任何基类继承。

上限 最常见的约束类型是上限,它对应于 Java 的 extends 关键字:

因此,除非您只想将其扩展为对象(字符串和 ByteArray 都扩展对象),否则您将需要使用泛型。

我想这个例子会让你有一个基本的了解

https://pl.kotl.in/umls8tYpV

基本上,您使用泛型,然后使用 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))
}

© www.soinside.com 2019 - 2024. All rights reserved.