Voy a utilizar el siguiente método de las extensiones Spring Data Kotlin:
inline fun <reified T : Any> MongoOperations.bulkOps(bulkMode: BulkMode, collectionName: String? = null): BulkOperations La pregunta es: ¿puedo evitar de alguna manera especificar T suponiendo que no quiero proporcionar un nombre de clase de entidad (eso es porque especificaré explícitamente collectionName y, en este caso, el tipo de clase puede ser null ). Me gustaría escribir algo como:
val ops = mongoTemplate.bulkOps<null>(BulkOperations.BulkMode.UNORDERED, collectionName = "i_know_better") ¿Existe un tipo literal para null con el que pueda parametrizar bulkOps ?
Creo que la respuesta corta es no.
Parece que confundes tipos con valores. null es un valor y no un tipo, por lo que no se puede usar como tipo en métodos genéricos.
En su ejemplo específico, incluso si pudiera usar nulo, mirando el código, ¿qué esperaría que sucediera?
@Suppress("EXTENSION_SHADOWED_BY_MEMBER") inline fun <reified T : Any> MongoOperations.bulkOps(bulkMode: BulkMode, collectionName: String? = null): BulkOperations = if (collectionName != null) bulkOps(bulkMode, T::class.java, collectionName) else bulkOps(bulkMode, T::class.java) Como puede ver, siempre se llama a T::class.java . ¿Cuál sería el resultado de null::class.java ?
No estoy familiarizado con Spring Data, por lo que realmente no puedo proporcionar una alternativa, pero diría que necesita buscar otro método o usar una clase apropiada aquí. El tipo genérico está marcado como T : Any , por lo que presumiblemente puede ser cualquier tipo que no admita valores NULL. Me pregunto si la Unit funcionaría. Nuevamente, no estoy seguro de para qué se usa esta clase.
Para responder a la pregunta en general, puede usar Nothing? para representar el tipo que solo contiene el valor null .
Dicho esto, como ya dijo @Fred, el método que está considerando aquí establece explícitamente T : Any , lo que significa que solo se permiten tipos que no aceptan valores NULL. Y tiene sentido dado que la función está accediendo a la clase de T