Ошибка вывода типа с использованием lamdba, но не при использовании закрытия в kotlin - PullRequest
0 голосов
/ 08 мая 2020

У меня есть следующие dtos в kotlin

UserInfo
UserInfoEntity

интерфейс

interface Transformer<S: Data, T: DataEntity> {
    fun transform(s: S): T
    fun transform(t: T): S
}

Реализация интерфейса

class UserInfoTransformer() :Transformer<UserInfo, UserInfoEntity>
/* both methods implemented */ 
override fun transform(userInfo: UserInfo): UserInfoEntity
override fun transform(userInfoEntity: UserInfoEntity): UserInfo

Репозиторий

interface UserInfoRepo: JpaRepository<UserInfoEntity, Long>
/*save, Jpa provides me the save method of signature 
<S extends T> S save(S entity) 
UserInfoEntity interpreted for S
*/ 

Теперь работает следующий код

fun saveUser(userInfo: UserInfo): UserInfo =
        Optional.of(userInfo)
            .map(userInfoTransformer::transform)
            .map {
                userInfoRepo.save(it)
            }
            .map(userInfoTransformer::transform).get()

Но следующий код не работает

fun saveUser(userInfo: UserInfo): UserInfo =
    Optional.of(userInfo)
        .map(userInfoTransformer::transform)
        .map(userInfoRepo::save)
        .map(userInfoTransformer::transform).get()

Я получаю следующие ошибки:

Error:(29, 14) Kotlin: Type inference failed: Not enough information to infer parameter U in fun <U : Any!> map(p0: Function<in UserInfoEntity!, out U!>!): Optional<U!>!
Please specify it explicitly.
Error:(29, 32) Kotlin: Type inference failed: Not enough information to infer parameter S in fun <S : UserInfoEntity!> save(p0: S!): S!
Please specify it explicitly.
Error:(30, 39) Kotlin: Overload resolution ambiguity: 
public abstract fun transform(s: UserInfo): UserInfoEntity defined in com.myswiftly.core.xformer.Transformer
public abstract fun transform(t: UserInfoEntity): UserInfo defined in com.myswiftly.core.xformer.Transformer

Почему map {} отличается от map (). Удивительно, но intellij не может их обнаружить во время компиляции. Я получаю их при попытке запустить приложение.

...