Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Weird type mismatch error in Scala

Tags:

scala

Already asked at scala-user, didn't get an answer.

I expect the below to compile:

trait Elems {

  trait Dummy

  abstract class Elem[A] extends Serializable with Dummy

  class BaseElem[A] extends Elem[A]

  implicit val BooleanElement: Elem[Boolean] = new BaseElem[Boolean]
  implicit val ByteElement: Elem[Byte] = new BaseElem[Byte]
  implicit val ShortElement: Elem[Short] = new BaseElem[Short]
  implicit val IntElement: Elem[Int] = new BaseElem[Int]
  implicit val LongElement: Elem[Long] = new BaseElem[Long]
  implicit val FloatElement: Elem[Float] = new BaseElem[Float]
  implicit val DoubleElement: Elem[Double] = new BaseElem[Double]
  implicit val UnitElement: Elem[Unit] = new BaseElem[Unit]
  implicit val StringElement: Elem[String] = new BaseElem[String]
  implicit val CharElement: Elem[Char] = new BaseElem[Char]
}

trait GoodMatch { self: Elems =>

  private def boxed_class(e: Elem[_]): Class[_] = e match {
    case BooleanElement => classOf[java.lang.Boolean]
    case ByteElement => classOf[java.lang.Byte]
    case ShortElement => classOf[java.lang.Short]
    case IntElement => classOf[java.lang.Integer]
    case LongElement => classOf[java.lang.Long]
    case FloatElement => classOf[java.lang.Float]
    case DoubleElement => classOf[java.lang.Double]
    case CharElement => classOf[java.lang.Character]
    case _ => ???
  }

}

abstract class BadMatch[+A <: Elems](scalan: A) {
  import scalan._

  protected def toLuaValue(x: Any, eX: Elem[_]): String = eX match {
    case UnitElement => ""
    case _ => ???
  }

  // should check type before conversion?
  protected def fromLuaValue[B](lv: Any, eA: Elem[B]): B = (eA match {
    case UnitElement => ()
  }).asInstanceOf[B]

}

And GoodMatch does, but BadMatch fails (in Scala 2.11.8):

[error] /tmp/rendererqu0xjasKpX/src/main/scala/test.scala:48: type mismatch;
[error]  found   : BadMatch.this.scalan.Elem[Unit]
[error]  required: BadMatch.this.scalan.Elem[_$3] where type _$3
[error]     case UnitElement => ""
[error]          ^
[error] /tmp/rendererqu0xjasKpX/src/main/scala/test.scala:63: type mismatch;
[error]  found   : BadMatch.this.scalan.Elem[Unit]
[error]  required: BadMatch.this.scalan.Elem[B]
[error]     case UnitElement => ()
[error]          ^

Removing with Dummy makes BadMatch compile as well.

Is this a Scala bug? If so, is it a known one?

like image 804
Alexey Romanov Avatar asked Dec 05 '25 07:12

Alexey Romanov


1 Answers

Yes, it's a Scala compiler bug: https://issues.scala-lang.org/browse/SI-9779.

like image 50
Alexey Romanov Avatar answered Dec 08 '25 00:12

Alexey Romanov



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!