我想创建一个具有依赖类型的变量。
我有
val a: Any = 5
我希望
val b: [TypeOfA] = a
TypeOfA
必须是Any
(Int
,String
或MyClass
)的子类型,而不是任意。
我不能使用scala反射,因为此代码是scalajs代码(不是JVM)的一部分。
我尝试过:
trait DepValue{
type V
val value: V
}
def mk[T](x: T) = new DepValue{
type V = T
val value = x
}
但我没有得到我想要的结果:
val x: Any = 5
magic(mk(x))
res70: Any = 5
我想res70: Int = 5
当类型不是Any
:
val y = 5
y: Int = 5
magic(mk(y))
res72: Int = 5
有没有办法做到这一点?
答案 0 :(得分:1)
我认为你正在混淆运行时和编译时类型。你的例子失败了,因为当你说:
val x: Any = 5
magic(mk(x))
res70: Any = 5
您明确告诉编译器 x
的类型是Any
,而不是Int
。所以它正在做你告诉它的事情:在编译时,它只知道这是一个Any
。 (如果你刚才说val x = 5
,那就行了。)
我认为你要求的是编译器应该以某种方式推断出x
的类型是Int
。但是因为你告诉它它是Any
,所以简单的编译器在编译时不再知道它。系统只在运行时知道这一点,这太晚了。
这些与依赖类型本身没有多大关系 - 更多的是你隐藏了类型信息这一事实,而且编译器不能只是再次出来......