That said, there is a Kotlin way to do a similar thing using higher order functions. E.g.
enum class CommandStatusEnum {
A, B, C
}
class Event(id: UUID, commandStatus: CommandStatusEnum, message: Any)
class Command(id: UUID, commandStatus: CommandStatusEnum, message: Any)
fun <T : Any> process(
id: UUID,
commandStatus: CommandStatusEnum,
message: Any,
creator: (id: UUID, commandStatus: CommandStatusEnum, message: Any) -> T
)T {
/* process stuff */
return creator(id, commandStatus, message)
}
// usage
process(UUID.randomUUID(), A, "", ::Event)
What makes this possible is that you know the type of object you want to receive, and resulting function is type-safe, whereas
fun <T> process(id: UUID, commandStatus: CommandStatusEnum, message: Any): T
would require inlining, reification and use of reflection and would not be type-safe or refactoring friendly at all.