为什么Scala没有decltype?

时间:2015-03-13 17:14:13

标签: scala type-inference decltype

有时人们可能希望声明xy属于同一类型。使用vals类型推断处理得非常好,但这在其他一些方面不起作用,例如with function types

对于具有一些C ++经验的程序员来说,一个看起来很明显的解决方案是decltype。目前的Scala似乎没有这样的设施。

对相关问题的回答告诉我们:

  

因为类型不是一等公民

我不得不承认我不理解这一点。我认为类型不是C ++中的一等公民,但它仍然可以拥有decltype。我不是要求decltype类似于泛型中的类型参数或任何类似参数(我理解泛型不是模板,类型会被删除)。不过,我认为一个运算符允许我在一个预期类型的​​地方使用一种表达式 - 当然编译器必须能够计算一个表达式类型,否则val定义的类型推断不会是可能的。

可以像下面一样使用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无法拥有它?是否有一些使用编译时反射的解决方案可以实现这个?

1 个答案:

答案 0 :(得分:2)

我的第一次刺伤:

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