Owe*_*wen 4 types scala dependent-type
我试图在Scala中获得最小形式的依赖类型.如果我有
class A[T <: Int]
val x: Int = 7
Run Code Online (Sandbox Code Playgroud)
我可以
val a = new A[x.type]
Run Code Online (Sandbox Code Playgroud)
现在有可能x从它的单身人物中恢复x.type吗?
或者,如果这不可能,是否可以以某种方式将稳定标识符与类型相关联,然后将其提取出来?
不,你不能恢复x从x.type因为JVM类型擦除.例如,如何实施?
def f[A]: A = ???
f[x.type]
Run Code Online (Sandbox Code Playgroud)
在JVM字节码级别,没有办法f可以找到x: A给定的值,A = x.type因为它没有任何可用的东西:所有类型参数在运行时都会丢失,无论如何,该x值在f参数堆栈上不可用.
出于同样的原因,要获得类型的稳定ID,您必须将其重新定义为Manifest值.但是当我尝试时,我得到一个奇怪的结果,
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 !?
Run Code Online (Sandbox Code Playgroud)
我不确定为什么这两种类型的清单是相同的 - 它们甚至有不同的toString表现形式.这可能是Scala的错误吗?更新:根据ScalaDoc,类型关系运算符<:<和=:=应仅被视为近似值,因为类型一致性的许多方面尚未在清单中充分表示.
总而言之,在JVM上不会自动将类型信息实现为运行时值.Scala Manifest应该填补空白,但我猜它不适用于依赖类型.