有一些框架完全采用类型类模式,scalaz和shapeless是很好的例子。因此,在某些情况下,类型类比普通的Java类和多态性更可取。
我非常钦佩隐式证据表达的能力,并且想知道为什么这种方法在实际应用中缺乏。什么原因促使Scala程序员使用基本类?类型类显然会增加代码量和运行时间,但是否还有其他原因呢?
我学习Scala时没有Java经验,不知道经典的Scala-Java类可能带来哪些重要的好处。
我正在寻找一些引人注目的使用案例,展示类型类无法胜任或效果不佳的领域。
有一些框架完全采用类型类模式,scalaz和shapeless是很好的例子。因此,在某些情况下,类型类比普通的Java类和多态性更可取。
我非常钦佩隐式证据表达的能力,并且想知道为什么这种方法在实际应用中缺乏。什么原因促使Scala程序员使用基本类?类型类显然会增加代码量和运行时间,但是否还有其他原因呢?
我学习Scala时没有Java经验,不知道经典的Scala-Java类可能带来哪些重要的好处。
我正在寻找一些引人注目的使用案例,展示类型类无法胜任或效果不佳的领域。
类型类和继承都能以不同的方式实现代码重用。继承适用于提供针对内部变化的正确功能。
class Foo { def foo: String = "foo" }
def fooUser(foo: Foo) { println(foo.foo) }
class Bar extends Foo {
private var annotation = List.empty[String]
def annotate(s: String) { annotation = s :: annotation }
override def foo = ("bar" :: annotation.map("@" + _)).mkString(" ")
}
Bar
,即使他们只知道类型为Foo
,每个使用Foo
的人都能获得正确的值。 您不必预测您可能需要可插入功能(除了不将foo
标记为final
)。 您无需跟踪类型或将见证实例向前传递;您只需在任何需要Foo
的地方使用Bar
并且它会做正确的事情。 这是一件大事。 如果您想要一个固定的接口,并且底层具有易于修改的功能,则继承是您的选择。Foo
进行排序。 如果您尝试class Foo extends Sortable[Foo] {
def lt(you: Foo) = foo < you.foo
def foo = "foo"
}
你可以将这个传递给任何能够对Sortable
进行排序的内容。但是,如果你想按名称长度而不是标准排序进行排序怎么办?那么,
class Foo extends LexicallySortable[Foo] with LengthSortable[Foo] {
def lexicalLt(you: Foo) = foo < you.foo
def lengthLt(you: Foo) = foo.length < you.foo.length
def foo = "foo"
}
Comparator
来展示出来)。 - Travis Brown