Приведение типов для удовлетворения ограничений нескольких типов - PullRequest
0 голосов
/ 22 января 2019

Возможно ли приведение типов для удовлетворения ограничений нескольких типов в kotlin?

Скажем, у меня есть следующий случай, но я хочу избежать приведения типов к классу C (если несколько классов реализуют A и B или я не знаю тип C):

interface A
interface B

class C: A, B

fun <T> foo(bar: T) where T: A, T: B {

}

Можно ли одновременно набирать A и B?Умный актерский состав, кажется, не позволяет этого.Могу ли я как-нибудь вручную привести?

val c = C()
foo(c) // works

val d: Any = c
if (d is A && d is B) {
    foo(d) // smart cast doesn't work here, compiler error
}

// Something like this maybe?
foo(d as A && B)

Я знаю, что это возможно, создав новый интерфейс, который наследует от A и B, и затем использую его, но это может быть невозможно, если я наденуне контролирует рассматриваемые классы.

Спасибо

1 Ответ

0 голосов
/ 22 января 2019

Тип должен явно реализовывать требуемые интерфейсы, и поскольку Any не может быть одновременно B и A (даже если он реализует оба) одновременно, должен существовать третий тип, например C.

Этот схожий вопрос имеет общую работу; Возможно ли приведение пересечения в Kotlin?

, поэтому произвольные типы T, которые реализуют A и B, могут быть распознаны как таковые, но is и as не могутбыть непосредственно составленным с &&, что делает невозможным выполнение ограничений вашего типа функций без какой-либо явно реализующей оболочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...