加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在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应该填补空白,但我想它不适用于依赖类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读