在scala中定义基于duck typing的泛型类型?

时间:2015-03-31 12:22:30

标签: scala generics structural-typing

我知道我可以在generics中定义鸭子类型,如下所示

trait MyTrait[A <: {def someMethod(key: String): String}]

但我不想在我的string定义中指定整个大trait

如何将其拆分为两个(我希望我能拥有的):

type A = B <: {def someMethod(key: String): String}

trait MyTrait[A]

1 个答案:

答案 0 :(得分:9)

你可以这样做:

type B = { def someMethod(key: String): String }
trait MyTrait[A <: B]

事实上,当结构类型超过50个字符时,一些Scala样式指南会推荐此细分。 Here's one from the Scala docs

  

如果结构类型的长度小于50个字符,则应在单行上声明。否则,它们应该分成多行,并且(通常)分配给它们自己的类型别名

您不能将类型绑定A <: B本身分配给类型别名,因为它不是类型,而是对MyTrait的泛型参数的约束。您可以阅读有关类型边界here的更多信息。