首页 > 解决方案 > 检测具体类型中的可空性

问题描述

正如在这个问题中所讨论的,您可以检测一个具体类型是否包含 null:

inline fun <reified T> isTNullable() = null is T

但是,我希望进行更复杂的查询,但我不确定这是否可行:测试具体类型T是否为 aPair以及其组件中的哪些(如果有)可以为空。我想要一个具有以下属性的方法:

inline fun <reified T> nullabilityOfPairComponents(): Pair<Boolean, Boolean>?

nullabilityOfPairComponents<Int>() == null
nullabilityOfPairComponents<Pair<Int?, String>> = Pair(true, false)
nullabilityOfPairComponents<Pair<Int?, String?>> = Pair(true, true)

这可能吗?我观察到KTypes 有一个可空性组件,但似乎我们目前只能从具体类型中检索 a KClass,而不是 a 。KType

请注意,我们不能使用类似 的技巧<reified A, reified B, T : Pair<A, B>>,因为此方法必须接受任意类型(<Int>示例)。

标签: kotlin

解决方案


使用实验性 API,当然可以:

@OptIn(ExperimentalStdlibApi::class)
inline fun <reified T : Any> nullabilityOfPairComponents(t: T): Pair<Boolean, Boolean>? {
  if (T::class.java != Pair::class.java) return null
  val (t1, t2) = typeOf<T>().arguments
  return Pair(
      t1.type!!.isMarkedNullable,
      t2.type!!.isMarkedNullable
  )
}

这取决于实验typeOf方法。


推荐阅读