Skip to content

should compile - existential combined with f bounded polymorphism #10300

Open
@jhegedus42

Description

@jhegedus42

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions