¿Es posible encasillar para satisfacer múltiples restricciones de tipo en kotlin?
Digamos que tengo el siguiente caso, pero quiero evitar la conversión de tipos a la clase C (en caso de que varias clases implementen A y B , o no conozco el tipo C ):
interface A interface B class C: A, B fun <T> foo(bar: T) where T: A, T: B { } ¿Es posible encasillar a A y B simultáneamente? Smart Cast no parece permitir esto. ¿Puedo lanzar manualmente de alguna manera?
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) Sé que es posible crear una nueva interfaz que herede tanto de A como de B y luego usarla, pero puede que no sea posible si no controlo las clases en cuestión.
Gracias
El tipo tiene que implementar explícitamente las interfaces requeridas y dado que Any no puede ser tanto B como A (aunque implemente ambas) simultáneamente, tiene que haber un tercer tipo, como C .
Esta pregunta similar tiene un trabajo genérico; ¿Es posible el casting de intersecciones en Kotlin?
por lo tanto, los tipos T arbitrarios que implementan A y B pueden reconocerse as tales, pero no is pueden componer directamente con && , lo que hace imposible satisfacer las restricciones de tipo de funciones sin algún tipo de contenedor de implementación explícita.