在 Kotlin 中检查 ArrayList 的类型

lbe*_*tto 5 kotlin

Kotlin 提供了 Array.isArrayOf() 来检查数组是否属于某种类型。

它是这样使用的

if(object.isArrayOf<String>())
Run Code Online (Sandbox Code Playgroud)

并像这样定义

/**
 * Checks if array can contain element of type [T].
 */
@Suppress("REIFIED_TYPE_PARAMETER_NO_INLINE")
public fun <reified T : Any> Array<*>.isArrayOf(): Boolean =
    T::class.java.isAssignableFrom(this::class.java.componentType)
Run Code Online (Sandbox Code Playgroud)

但它仅适用于 Array。我需要检查ArrayList。

我想像这样改变签名。

@Suppress("REIFIED_TYPE_PARAMETER_NO_INLINE")
public fun <reified T : Any> ArrayList<*>.isArrayListOf(): Boolean =
    T::class.java.isAssignableFrom(this::class.java.componentType)
Run Code Online (Sandbox Code Playgroud)

但 class.java.componentType 特定于 Array

如何检查我拥有的 ArrayList 类型?

我应该澄清一下,我只关心它是否是 3 种类型之一,所以我不需要完全开放式的检查方式。

Kev*_*lta 6

如果你想检查列表的类型,你可以这样做:

when (list.firstOrNull()) {
   is String -> { /*do something*/ }
   is Int -> { /*do another thing*/ }
   else -> { /*do something else*/ }
}
Run Code Online (Sandbox Code Playgroud)

如果您需要使用某种类型的列表,您可以使用:

list.filterInstance</*the type you need*/>()
Run Code Online (Sandbox Code Playgroud)

希望这对你有用。


Ale*_*nov 4

你不能。数组是唯一可能实现这一点的泛型类型(因为它们在同一意义上并不是真正的泛型,Kotlin 只是隐藏了它)。

你唯一能做的就是查看它的内容,但是当然

  1. 这不适用于空列表;

  2. 如果列表包含例如 a String,则它可能是ArrayList<String>, ArrayList<CharSequence>,ArrayList<Any>等。

以此目的:

我需要将其引导到适当的 Bundle 方法中。bundle.putStringArrayList()、bundle.putIntegerArrayList() 等

我相信,两者都不是问题。