scalapolymorphismtype-inferencetype-projection

How to infer the right type parameter from a projection type?


I have some troubles having Scala to infer the right type from a type projection.

Consider the following:

trait Foo {
  type X
}

trait Bar extends Foo {
  type X = String
}

def baz[F <: Foo](x: F#X): Unit = ???

Then the following compiles fine:

val x: Foo#X = ???    
baz(x)

But the following won't compile:

val x: Bar#X = ???    
baz(x)

Scala sees the "underlying type String" for x, but has lost the information that x is a Bar#X. It works fine if I annotate the type:

baz[Bar](x)

Is there a way to make Scala infer the right type parameter for baz?
If not, what is the general answer that makes it impossible?


Solution

  • The program compiles by adding this implicit conversion in the context:

    implicit def f(x: Bar#X): Foo#X = x
    

    As this implicit conversion is correct for any F <: Foo, I wonder why the compiler does not do that by itself.