在Scala中,是否可以检索单例类型引用的`val`?

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吗?

或者,如果这不可能,是否可以以某种方式将稳定标识符与类型相关联,然后将其提取出来?

Kip*_*ros 6

不,你不能恢复xx.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应该填补空白,但我猜它不适用于依赖类型.