在Scala中,是否可以检索单例类型引用的`val`?
发布时间:2020-12-16 09:52:35 所属栏目:安全 来源:网络整理
导读:我试图在 Scala中获得最小形式的依赖类型.如果我有 class A[T : Int]val x: Int = 7 我可以 val a = new A[x.type] 现在可以从单例x.type中恢复x吗? 或者,如果这不可能,是否可以以某种方式将稳定标识符与类型相关联,然后将其提取出来? 解决方法 不,由于JVM
我试图在
Scala中获得最小形式的依赖类型.如果我有
class A[T <: Int] val x: Int = 7 我可以 val a = new A[x.type] 现在可以从单例x.type中恢复x吗? 或者,如果这不可能,是否可以以某种方式将稳定标识符与类型相关联,然后将其提取出来? 解决方法
不,由于JVM类型擦除,您无法从x.type恢复x.例如,如何实施?
def f[A]: A = ??? f[x.type] 在JVM字节码级别,f无法找到值x:给定A = x.type,因为它没有任何可用的东西:所有类型参数在运行时丢失,无论如何,x值在f的参数堆栈中不可用. 出于同样的原因,要获得类型的稳定ID,您必须将其作为清单值进行修改.但是当我尝试时,我得到一个奇怪的结果, def f[A : Manifest] = implicitly[Manifest[A]] val x = "hi" val y = "ho" println(f[x.type]) // hi.type println(f[y.type]) // ho.type f[x.type] == f[y.type] // true !? 我不确定为什么这两种类型的清单是相同的 – 它们甚至有不同的toString表示.这可能是Scala的错误吗?更新:根据ScalaDoc,类型关系运算符<:<和=:=应仅被视为近似值,因为类型一致性的许多方面尚未在清单中充分表示. 总而言之,在JVM上不会自动将类型信息实现为运行时值. Scala的Manifest应该填补空白,但我想它不适用于依赖类型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |