Open
Description
does not compile :
trait B[T <: B[T]]
case class A[T <: B[T]](t: T)
class C() extends B[C]
val c: C = new C()
val r2: A[_] = A(c) //compiles
val r3: A[_] = A(c) //compiles fine
val r4: A[_] = r3 //compiles fine
val r5: (A[_]) = (r3) //compiles fine
val r6: (A[_], A[_]) = (r3, r3) // does not compile, strange
another snippet:
import scala.language.existentials
trait B[T <: B[T]]
case class A[T <: B[T]](t: T)
class C() extends B[C]
val c: C = new C()
type SomeB = T forSome { type T <: B[T] }
val r3: A[_<:SomeB] = A(c) //compiles fine
val r4: A[C] = A(c) //compiles fine
val r5: (A[_<:SomeB]) = (r3) //compiles fine
val r6:((_<:SomeB),((_<:SomeB))) = (c,c) // compiles fine
val r7:(A[_<:SomeB],((_<:SomeB))) = (A(c),c) // compiles fine
val r8:(A[_<:SomeB],(A[_<:SomeB])) = (A(c),A(c)) // compiles fine
val r10:(A[_<:SomeB],(A[_<:SomeB])) = (A(c),r3) // does NOT compile - SHOULD COMPILE ?
val r9:((A[T],A[T]) forSome {type T<:B[T]}) = ((r4:A[C]),r4) // does compile
val r11:((A[T],A[T]) forSome {type T<:B[T]}) = (r4,r4) // does compile