Supongamos que tenemos la siguiente interfaz de Java definida en alguna biblioteca externa (por lo que no tenemos control sobre ella):
public interface JavaTest<R extends Something> { } public class JavaTestImpl implements JavaTest<SomethingSpecific> { public static final JavaTestImpl INSTANCE = ... } Ahora queremos escribir la función Scala que tomará una instancia arbitraria de JavaTest como argumento y extraerá tanto el tipo de instancia como el argumento genérico de R (por ejemplo, queremos hacer una búsqueda implícita de clase de tipo en la clase de instancia):
def test[A <: Something, X <: JavaTest[A]](x: X)(implicit tc: TypeClass[X]): A = {} test(JavaTestImpl.INSTANCE) // should be [SomethingSpecific, JavaTestImpl] desafortunadamente, no funciona de manera directa: el compilador infiere la invocación de test como [Nothing, JavaTestImpl] y luego falla inmediatamente porque los tipos inferidos son incorrectos y no satisfacen las restricciones.
¿Hay alguna manera de hacer que el compilador de Scala infiera los argumentos de tipo correspondientes sin cambiar la parte de Java y sin escribir muchos repetitivos cada vez? O, para poner la pregunta de otra manera, ¿hay alguna forma de extraer el tipo genérico ( SomethingSpecific ) dado que conocemos el tipo de instancia ( JavaTestImpl )?