首页 文章

使用结构类型时出现意外错误

提问于
浏览
2

我这是一个愚蠢的问题 . 我期待以下代码可以工作,因为 a 有一个 mkString 方法 .

val a = "abc".toCharArray

case class A[T: {def mkString(): String}](i: T) {
  val s = i.mkString
}

A(a)

但它给出了以下错误:

错误:(3,16)AnyRef {def mkString():String}不接受类型参数case class A [T:{def mkString():String}](i:T)错误:(4,14)value mkString不是类型参数T val s = i.mkString的成员

我正在使用Scala 2.11.6 .

任何帮助将非常感谢!谢谢 !

2 回答

  • 1

    那里至少有三个错误:

    • 应该是 <: ,而不是 : . 结构类型不是类型类 .

    • def mkString(): Stringdef mkString: String 不同 .

    • 原始JVM数组对 mkString 等方便的scala方法一无所知 . 你需要一个 WrappedArray .

    这在这里工作:

    import scala.language.reflectiveCalls
    val a = "abc".toCharArray
    
    import collection.mutable.WrappedArray
    
    case class A[T <: { def mkString: String }](i: T){
      val s = i.mkString
    }
    
    A(a: WrappedArray[Char])
    
  • 2

    类型边界 [A : B] 是一种速记方式,表示类型 A 存在类型类 B 的实例,因此它们是等效的:

    def foo[A : B]: C
    
    def foo[A](implicit b: B[A]): C
    

    您可能正在寻找的语法是 [A <: B] ,这意味着 A 必须是 B 的子类 .

    但是你有 mkString 实际上不在 Array 类的问题;它在 ArrayOps 中定义(带有 Array 的隐式转换),如文档中所述:

    此成员是通过scala.Predef中方法genericArrayOps执行的从Array [T]到ArrayOps [T]的隐式转换添加的 .

    你可以解决这个问题:

    val a = "abc".toCharArray
    
    case class A[T](i: T)(implicit conv: T => {def mkString: String}) {
      val s = conv(i).mkString
    }
    
    A(a)
    

相关问题