Я работаю с шаблоном ask
Акки в Kotlin, и я столкнулся с проблемой ковариации. Вот ситуация:
interface Token {
// arbitrary stuff
}
class SpecificToken(override val underlying: TokenFound) : Token, ArbitraryInterface<TokenFound> {
// arbitrary stuff
}
interface TokenRepository {
fun find(): CompletionStage<Token?>
}
class SpecificTokenRepository : TokenRepository {
val actor1 = getActor1()
val actor2 = getActor2()
val message1 = getMessage1()
val message2 = getMessage2()
val timeout = getTimeout()
fun find(): CompletionStage<Token?> =
inquire().thenCompose {
when (it) {
is Inquiry -> Patterns.ask(actor, message, timeout)
.handle { response, t ->
handleExceptions(t)
if (response is TokenFound) SpecificToken(response) else null
}
else -> CompletableFuture.completedFuture(null)
}
fun inquire(): CompletionStage<Inquiry?> =
Patterns.ask(actor, message, timeout)
.handle { response, t ->
handleExceptions(t)
if (response is Inquiry) response else null
}
}
Проблема здесь в том, что thenCompose
имеет проблему с обобщением Java, которое я предполагаю, читая:
Type inference failed: Cannot infer type parameter U in
fun <U : Any!> thenCompose
(fn: ((t: Inquiry?) → CompletionStage<U!>!)!): CompletionStage<U!>!
None of the following substitutions
(((Inquiry?) → CompletionStage<Token?>!)!)
(((Inquiry?) → CompletionStage<SpecificToken?>!)!)
(((Inquiry?) → CompletionStage<Nothing!>!)!)
can be applied to
((Inquiry?) → CompletionStage<out SpecificToken?>!)
Что необходимо изменить здесь и, если возможно, не могли бы вы объяснить, почему? Спасибо!