Skip to content

Inconsistent matching when using type alias of Union type #8956

Closed
@hmf

Description

@hmf

Minimized code

type Numeric = Double | Int

  val v1 = 100
  val v2 = 100.0
  def check1(i: Double | Int | String): Unit = {
    i match {
      case a:(Double | Int) => println(s"numeric = $a")
      case _ => println("categorical")
    }
  }
  /*
    [warn] 25 |      case a:Numeric => println(s"numeric = $a")
    [warn]    |           ^^^^^^^^^
    [warn]    |  the type test for gg.SlidingIssue.Numeric cannot be checked at runtime
    [warn] one warning found
   */
  def check2(i: Double | Int | String): Unit = {
    i match {
      case a:Numeric => println(s"numeric = $a")
      case _ => println("categorical")
    }
  }

Output

    [warn] 25 |      case a:Numeric => println(s"numeric = $a")
    [warn]    |           ^^^^^^^^^
    [warn]    |  the type test for gg.SlidingIssue.Numeric cannot be checked at runtime
    [warn] one warning found

Expectation

I expected that using union types directly or using a type alias should produce the same result. However when using a type alias in a match (in check1) I get the warning when using a type but not when using the unon type directly (check2).

This does not seem to happen consistently all the time.

Tested with 0.24.0-RC1

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions