模式匹配通用返回类型

时间:2012-01-28 18:10:41

标签: generics scala pattern-matching return-type

修改
留给后人,但差不多一年后,为了得到投票,很好......现在不会做下面的事情,但当时,开始使用Scala,问题通常来自一个无知的地方......

ORIGINAL
我知道我可以将一个模式匹配包装在一个方法中,如下所示指定泛型类型:

def getTeam[T <: _Team](clazz: String): _Team =
  clazz match {
    case "roster" => new RosterController
    case "schedule" => new ScheduleController
  }

并获得一个有意义的类型(_Team)供编译器使用。

但是,我想知道是否有可能在没有包装器方法且没有asInstanceOf [_Team]样板的情况下执行此操作?即

之外的其他东西
clazz match {
  case "roster" => new RosterController.asInstanceOf[_Team]
  case "schedule" => new ScheduleController.asInstanceOf[_Team]
}

如果不可能的话,不是世界末日,而是更愿意进行匹配而不是拆分成单独的方法。

由于

2 个答案:

答案 0 :(得分:2)

我不确定你认为这种方法会发生什么,但看起来你要么感到困惑,要么写错了。

在您的示例中,T是一个类型参数,上面绑定了类型_Team(我假设它是一个类或一个特征)。您随后会忽略T,因此 可能是幻像类型,但是从您的问题来看,但它看起来并不像。

不可能需要将RosterController投射到_Team,因为它是一个或不是。我可以推断这一点,因为RosterController必须是一个具体的类,因为你实例化它。它可以是_Team的子类型,也可以不是。

如果_Team是一个特征,它可以混合在:

new RosterController with _Team

但是因为你没有解释你想要实际做什么,所以很难说肯定! RosterController是否也参数化了?


编辑 - 从下面的评论中,您似乎想知道编译器推断出该表达式为match语句的表达式的结果类型。

这是一个有用的例子,说明编译器如何能够推断出相当多的很酷的东西

scala> class Bar; class Baz; trait Foo
defined class Bar
defined class Baz
defined trait Baz

现在让我们创建一个匹配表达式:

scala> def foo(s: String) = s match {
   | case "a" => new Baz with Foo
   | case _   => new Bar with Foo
   | }
foo: (s: String)ScalaObject with Foo

所以编译器在这里正确地推断了Foo。也许你可以改写一下你的问题,在一个 REPL例子中提取你所期望的,以及它与实际情况的不同之处。

答案 1 :(得分:1)

  

trait _Team {def doWhat_TeamCanDo(s:String){println s}}

class MyTeamString(clazz: String)

 implicit def getTeam: _Team =
  clazz match {
    case "roster" => new RosterController with _Team
    case "schedule" => new ScheduleController with _Team
 }
}

implicit def strToMyTeamString(s:String):MyTeamString= MyTeamString(s)

现在您可以在需要时将任何字符串“转换”为_Team,隐含地:

"roster".doWhat_TeamCanDo("foo")
相关问题