У меня есть следующие 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 не может их обнаружить во время компиляции. Я получаю их при попытке запустить приложение.