Возможно ли пересечение в Котлин?

У меня есть метод на Java, например:

public <T extends A & B> methodName(T arg, ...) 

где A – класс, а B – интерфейс.

В моем классе kotlin у меня есть другая variable типа C, и я хочу добиться следующего:

 if (variable is A && variable is B) { methodName(variable, ...) } else { // do something else } 

Возможно ли правильно переместить variable так, чтобы ее можно было использовать в качестве аргумента без ошибок?

В настоящее время variable имеет метод setter, поэтому интеллектуальное литье недоступно. Тем не менее, я также проверил его с локальным значением val и значение выводится на тип Any который не помогает.

Котлин не поддерживает типы пересечений. Это приводит к тому, что variable становится умной, отличной от Any , потому что это общий предок A и B

Однако Котлин поддерживает общие ограничения типа. Вы можете использовать это, чтобы ограничить параметр типа одним или несколькими типами. Это можно использовать как для методов, так и для классов. Это синтаксис для функций (эквивалент вашего methodName в Котлин):

 fun <T> methodName(arg: T) where T : A, T : B { .... } 

Вы можете использовать это, чтобы обойти свою проблему, создав класс, который расширяет как A и B , а затем делегирует реализацию этих типов вашему объекту. Как это:

 class AandB<T>(val t: T) : A by t, B by t where T : A, T : B 

Теперь вы можете вызвать methodName , изменив ваш if-test, чтобы проверить, является ли это AandB<*> :

 if (variable is AandB<*>) { methodName(variable, ...) } 

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

Примечание. Класс AandB не реализует hashCode , equals или toString . Вы можете реализовать их для делегирования на реализацию t .

Примечание 2: Это работает только в том случае, если A и B являются интерфейсами. Вы не можете делегировать класс.