为什么 Scala 没有 decltype?

Why Scala does not have a decltype?

有时可能希望将 x 声明为与 y 相同的类型。使用 vals 类型推断可以很好地处理这个问题,但这在其他一些领域不起作用,比如 .

对于具有一些 C++ 经验的程序员来说似乎显而易见的解决方案是 decltype。目前的 Scala 中似乎没有这样的设施。

链接问题的答案表明:

because types are not first class citizens

我不得不承认我不明白这一点。我不认为类型是 C++ 中的第一个 class 公民,但它仍然可以拥有 decltype。我不是在问 decltype 之类的泛型类型参数或类似的东西(我知道泛型不是模板,类型在其中被删除)。不过,我认为一个运算符允许我在需要类型的地方使用表达式的类型——当然编译器必须能够评估表达式类型,否则 val 定义的类型推断不会有可能。

A decltype 可以像下面这样使用 - 代码没有尝试做任何有用的事情,只是为了说明语法和基本用法:

case class A(x:Int = 0)

val a = new A(10)
val b = new decltype(a)

def f(c:decltype(a)) : decltype(a.x+a.x)

缺少 decltype 是经过深思熟虑的决定,还是有一些特定原因导致 Scala 无法拥有它?是否有一些使用编译时反射的解决方案允许这样做?

我的第一次尝试:

class Decl[T] { type Type = T }
object Decl { def apply[T](x: T) = new Decl[T] }

例如,如果我们有一些变量 x 我们不想明确声明其类型:

val d = Decl(x)
type TypeOfX = d.Type