Skip to content

ClassCastException when returning a call-by-name type #10362

Open
@Atry

Description

@Atry
Welcome to Scala 2.12.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131).
Type in expressions for evaluation. Or try :help.

scala> import scala.language.higherKinds
import scala.language.higherKinds

scala> val byNameContainer = {
     |   def unwrap[ByName0[_]](f: ByName0[Unit] => Unit) = new {
     |     type ByName[A] = ByName0[A]
     |   }
     |   val f: (=> Unit) => Unit = { _ =>
     |     ()
     |   }
     |   unwrap(f)
     | }
byNameContainer: Object{type ByName[A] = => A} = $anon$1@69fa8e76

scala> 

scala> type ByName[A] = byNameContainer.ByName[A]
defined type alias ByName

scala> 

scala> trait IsByName[F] {
     |   type Value
     | 
     |   def make(byName: ByName[Value]): F
     |   def extract(byName: F): Value
     | }
defined trait IsByName

scala> 

scala> object IsByName {
     |   type Aux[F, Value0] = IsByName[F] {
     |     type Value = Value0
     |   }
     |   implicit def apply[Value0]: IsByName.Aux[ByName[Value0], Value0] =
     |     new IsByName[ByName[Value0]] {
     |       override type Value = Value0
     | 
     |       override def make(byName: ByName[Value0]): ByName[Value0] = byName
     | 
     |       override def extract(byName: => Value0): Value0 = byName
     |     }
     | }
defined object IsByName
warning: previously defined trait IsByName is not a companion to object IsByName.
Companions must be defined together; you may wish to use :paste mode for this.

scala> IsByName[Int].make(1)
java.lang.ClassCastException: java.lang.Integer cannot be cast to scala.Function0
  at IsByName$$anon$1.make(<console>:22)
  at IsByName$$anon$1.make(<console>:19)
  ... 29 elided

Related to #10344, #10345

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions