为推断类型键入别名

时间:2013-04-03 19:21:22

标签: scala

我有一个复杂的返回类型的方法,我想有一个函数,它将此方法的结果作为参数。是否可以为方法的返回类型创建别名?像C ++中的typeof

e.g。

object Obj {
    def method(x:Int) = 1 to x
    type ReturnType = ???

    //possible solution if i know a parameter for which the method won't fail
    val x = method(1)
    type ReturnType = x.type

    //another possible solution, I don't need a parameter that won't fail 
    //the method but i still think there is a better way
    lazy val x = method(1)
    type ReturnType = x.type

    //I would then like to have a function which takes ReturnType as a parameter
    def doit(t:ReturnType) = Unit
}

问题是编译器知道类型,但我不知道如何从他那里得到它。

2 个答案:

答案 0 :(得分:2)

我能想到的唯一方法是:

class Return[T](f:() => T) {
  type Type = T
}

def getDifficultReturnType() = 1 to 10

val Return = new Return(getDifficultReturnType)

def doIt(t:Return.Type) = {

}

我不确定这是否是你要找的。

答案 1 :(得分:0)

据我所知,这是不可能的。也许在未来的Scala版本type macros

在任何情况下,如果这种类型不重要,那么将其留下来并不是一个好的设计。我知道你不想输入80个字符,但是如果它保留那种类型(听起来很重要),那么它应该在某些点处进行说明。

您可以使用类型别名

object Obj {
  type ReturnType = My with Very[LongAndComplicated] with Name
  // explicit type ensures you really get what you want:
  def method(x: Int): ReturnType = 1 to x  

  def doit(t: ReturnType) {}
}