给出以下代码:
abstract class Field {
type T
val data: List[T]
def sum: T = data(0) + data(1)
}
Run Code Online (Sandbox Code Playgroud)
我在最后一行收到错误 - def sum: T = data(0) + data(1):
types2.scala:6:错误:类型不匹配;
发现:Field.this.T
必需:字符串
def sum:T = data(0)+ data(1)
Run Code Online (Sandbox Code Playgroud)^
也就是说,它期望数据(1)是a String.我不明白为什么......(scala 2.8.1)
非常感谢您的解释!
mis*_*tor 17
由于T不支持添加操作,因此编译器假定+为字符串连接操作.我在REPL尝试的以下行表明:
scala> implicitly[Any => {def +(s: String): String}]
res16: (Any) => AnyRef{def +(s: String): String} = <function1>
Run Code Online (Sandbox Code Playgroud)
你可以做的是需要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
Run Code Online (Sandbox Code Playgroud)
我用类型参数替换了抽象类型,因为我不知道如何在抽象类型上放置上下文绑定.我也改变了数据的类型List[A]来IndexedSeq[A]因为如其名索引序列是更适合比列表索引访问(这是你在做什么sum方法).最后,|+|是半群追加操作.对于数字类型,它将执行添加.对于序列,连接等.
| 归档时间: |
|
| 查看次数: |
270 次 |
| 最近记录: |