修改
留给后人,但差不多一年后,为了得到投票,很好......现在不会做下面的事情,但当时,开始使用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]
}
如果不可能的话,不是世界末日,而是更愿意进行匹配而不是拆分成单独的方法。
由于
答案 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")