繁体   English   中英

模式匹配通用返回类型

[英]Pattern Match Generic Return Type

编辑
将其留给后代使用,但是将近一年后,要被投票否决,不错……现在不会做下面的事情,但是当时,开始使用Scala时,问题通常来自于一个无知的地方…… 。

原版的
我知道我可以将模式匹配包装在具有指定通用类型的方法中,如下所示:

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]
}

如果不可能的话,还不是世界末日,而是更愿意进行比赛,而不是将比赛分成一个单独的方法。

谢谢

我不确定您认为此方法正在发生什么,但是您似乎感到困惑或写下了错误的内容。

在您的示例中, 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示例中准确地提取出您的期望以及与实际情况有何不同。

特质_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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM