¿Es posible el cruce de intersecciones en Kotlin?

Tengo un método en Java así:

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

donde A es una class y B es una interfaz.

En mi class de kotlin, tengo otra variable de tipo C, y deseo lograr lo siguiente:

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

¿Es posible moldear adecuadamente la variable para que pueda usarse como argumento sin errores?

Actualmente, la variable tiene un método setter, por lo que el casting inteligente no está disponible. Sin embargo, también lo he probado con un valor local y se deduce que el valor tiene un tipo Any que no ayuda.

Kotlin no admite types de intersección. Esto hace que la variable sea ​​inteligente para Any , porque ese es el ancestro común de A y B

Sin embargo, Kotlin admite restricciones de tipo genérico. Puede usar esto para restringir un parámetro de tipo a uno o más types. Esto se puede usar en ambos methods y classs. Esta es la syntax de las funciones (el equivalente de su methodName en Kotlin):

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

Puede usar esto para solucionar su problema creando una class que amplíe tanto A como B , y luego delegue la implementación de estos types a su object. Me gusta esto:

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

Ahora puede llamar a methodName cambiando su if-test para comprobar si se trata de un AandB<*> :

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

AandB embargo, necesitas ajustar la variable en un AandB alguna parte. No creo que puedas hacerlo si no tienes la información de tipo para la variable disponible en cualquier lugar.

Nota: La class AandB no implementa hashCode , equals o toString . Puede implementarlos para delegar a la implementación de t .

Nota 2: Esto solo funciona si A y B son interfaces. No puedes delegar a una class.