有时人们可能希望声明x
与y
属于同一类型。使用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无法拥有它?是否有一些使用编译时反射的解决方案可以实现这个?
答案 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