Scala:从Any

时间:2017-12-12 14:04:25

标签: scala class scala.js dependent-type

我想创建一个具有依赖类型的变量。

我有

val a: Any = 5 

我希望

val b: [TypeOfA] = a

TypeOfA必须是AnyIntStringMyClass)的子类型,而不是任意。
我不能使用scala反射,因为此代码是scalajs代码(不是J​​VM)的一部分。

我尝试过:

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

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

我认为你正在混淆运行时和编译时类型。你的例子失败了,因为当你说:

val x: Any = 5
magic(mk(x)) 
res70: Any = 5

明确告诉编译器 x的类型是Any,而不是Int。所以它正在做你告诉它的事情:在编译时,它只知道这是一个Any。 (如果你刚才说val x = 5,那就行了。)

我认为你要求的是编译器应该以某种方式推断出x的类型是Int。但是因为你告诉它它是Any,所以简单的编译器在编译时不再知道它。系统只在运行时知道这一点,这太晚了。

这些与依赖类型本身没有多大关系 - 更多的是你隐藏了类型信息这一事实,而且编译器不能只是再次出来......