给出以下代码:
abstract class Field { type T val data: List[T] def sum: T = data(0) + data(1) }
我在最后一行得到一个错误 – def sum:T = data(0)data(1):
types2.scala:6: error: type mismatch;
found : Field.this.T
required: String
def sum: T = data(0) + data(1)
06001
也就是说,它期望data(1)是String.
我不明白为什么……(scala 2.8.1)
非常感谢您的解释!
解决方法
由于T不支持加法运算,因此编译器假定为字符串连接操作.我在REPL尝试的以下行表明:
scala> implicitly[Any => {def +(s: String): String}] res16: (Any) => AnyRef{def +(s: String): String} = <function1>
您可以做的是要求T定义了Semigroup
代数. (如果类型支持关联追加操作,则类型为半群.)
scala> import scalaz._ import scalaz._ scala> import Scalaz._ import Scalaz._ scala> abstract class Field[A : Semigroup] { | val data: IndexedSeq[A] | def sum: A = data(0) |+| data(1) | } defined class Field scala> val f = new Field[Int] { | val data = IndexedSeq(2,3,4) | } f: Field[Int] = $anon$1@d1fd51 scala> f.sum res12: Int = 5
我用类型参数替换了抽象类型,因为我不知道如何在抽象类型上放置上下文绑定.我还将List [A]中的数据类型更改为IndexedSeq [A],因为名称表示索引序列比列表更适合索引访问(这是您在sum方法中执行的操作).最后,| |是半群追加操作.对于数字类型,它将执行添加.对于序列,连接等.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。