![](/img/trans.png)
[英]Perform pattern match on a generic value with type matching the return type
[英]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.