【发布时间】:2014-09-10 16:30:34
【问题描述】:
下面的最后一行语句产生错误: “类型不匹配;发现:TestExpandableWithLibrary.this.library.type(具有基础类型 org.typeclass.Library)需要:V”
这是我尝试进行隐式转换的地方。我简单地使用 typeclass 函数的前一行确实可以正常工作。
关于如何解决它的任何想法?
package org.typeclass
///////////////////////////////////////////////////////////////////////////////
// the domain objects
case class Book(bookName: String)
case class Library(libraryName: String, books: Set[Book])
object Library {
def apply(libraryName: String, bookNames: String*): Library =
Library(libraryName, bookNames.map(Book(_)).toSet)
}
case class TreeClass(nodeName: String, children: Seq[TreeClass])
///////////////////////////////////////////////////////////////////////////////
// the typeclass definition
trait Expandable[T, V, R] {
def expandWith(template: T, values: V): R
}
object Expandable {
def expandWithF[T, V, R](template: T, values: V)(implicit ev: Expandable[T, V, R]): R =
ev.expandWith(template, values)
implicit class ExpandableItem[T, V, R](val template: T) extends AnyVal {
def expandWithM(values: V)(implicit ev: Expandable[T, V, R]): R =
ev.expandWith(template, values)
}
}
///////////////////////////////////////////////////////////////////////////////
// a typeclass implementation
object ExpandableImpls {
implicit object ExpandableTreeClass extends Expandable[TreeClass, Library, TreeClass] {
def expandWith(template: TreeClass, library: Library): TreeClass = {
val parentName = s"${template.nodeName}.${library.libraryName}"
val children = library.books.map(book => TreeClass(s"${parentName}.${book.bookName}", Seq.empty)).toSeq
TreeClass(parentName, children)
}
}
}
//@RunWith(classOf[JUnitRunner])
class TestExpandableWithLibrary /*extends FlatSpec*/ {
import Expandable._
import ExpandableImpls._
val library = Library("test", "black", "white")
val root = TreeClass("parent", Seq.empty)
val useF = expandWithF(root, library) // this works
val useM = root.expandWithM(library) // this doesn't work!
}
【问题讨论】:
标签: scala implicit-conversion typeclass