Kotlin type-inference fails where Java's doesn't

Given the following code (which uses a dummy return but shows the issue):

import com.github.roookeee.datus.api.Datus
import com.github.roookeee.datus.api.Mapper
import com.github.roookeee.datus.immutable.ConstructorParameter

data class EntryDto(val id: Long?, val title: String, val content: String)
data class EntryEntity(val id: Long? = null, val title: String, val content: String) {
    fun toDto(): EntryDto {
        val mapper: Mapper<EntryEntity, EntryDto> = Datus.forTypes(this.javaClass, EntryDto::class.java)
        return EntryDto(null, "", "")

Kotlin is not able to infer the correct generic types whereas Java >= 8 does (given two Java classes that are identical to the data classes here - two immutable object classes). I tried with the defaults for Kotlin 1.3.0 and -XXLanguage:+NewInference but the later couldn’t even infer the right overload to pick for .immutable.

Here is the datus dependency information to make the above code compile (nothing else is needed):


Am I missing something? datus makes heavy use of generics including self-recursive generic types (in AbstractConstructorBuilder) so I can imagine it’s quite hard to infer, but this should not happen right? This makes datus unusable for kotlin atm :frowning:

You can find datus sources here