Reified type parameters
kotlin a un modificateur appelé reified
. La page officielle est ici
Reified peut être donné aux génériquesT
et peut être traité comme une classe de type réelle, de sorte que vous pouvez convertir avec T
, vérifier l'instance de T
avec l'instruction if, etc. Je vais.
Par exemple, il peut être défini comme suit.
// ListExt.kt
inline fun <reified T> List<T>.filterInstance(): List<T> {
val destination = mutableListOf<T>()
this.forEach {
if (it is T) destination.add(it)
}
return destination
}
Si vous appelez ça de kotlin
val nums = listOf(1, 2f, 3, 4f)
val ints = nums.filterIsInstance<Int>() // [1, 3]
Mais quand j'essaye d'appeler ça depuis java
List nums = Arrays.asList(1, 2f, 3, 4f);
List ints = ListExtKt.filterIsInstance(nums); // error: filterIsInstance has private access in ListExtKt
Reified
dans kotlin ne peut être donné qu'à la fonction en ligne, et il sera possible d'accéder à la classe de type réelle en la développant en ligne.
Lorsque vous appelez la fonction inline de kotlin depuis java, la fonction inline est appelée directement, elle n'est donc pas développée en ligne. Par conséquent, il semble qu'une erreur se produit lors de la tentative d'appel d'une fonction avec vérifié à partir de java.
Recommended Posts