Skip to content

type aliases + variance checks: to dealias or not to dealias (and: dealiasing loses annotations on type arguments) #8079

@scabug

Description

@scabug

There's no reason CovTrait should be afforded any privilege above CovAlias.

object Bug {
  import scala.annotation.unchecked.{ uncheckedVariance => uV }

  trait Base[T] { def f: java.util.Iterator[T] }
  trait CovTrait[+T] extends java.util.Iterator[T @uV]
  type CovAlias[+T] = java.util.Iterator[T @uV]

  // compiles
  class A[+T] extends Base[T @uV] { def f: CovTrait[T] = null }
  // fails
  class B[+T] extends Base[T @uV] { def f: CovAlias[T] = null }
  // <console>:17: error: covariant type T occurs in invariant position in type => Bug.CovAlias[T] of method f
  //          class B[+T] extends Base[T @uV] { def f: CovAlias[T] = null }
  //                                                ^
}

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions