【问题标题】:Explain this error in Scala (type parameters) [duplicate]在Scala中解释这个错误(类型参数)[重复]
【发布时间】:2016-10-28 19:42:27
【问题描述】:

在尝试使用类型变量时,我尝试了以下代码,但失败了(尝试编写可以添加任意两种数据类型的通用代码)。

令我惊讶的是错误。为什么编译器会抱怨它需要一个 String 数据类型?我没有在代码中的任何地方提到字符串

scala> def add[A](x:A, y:A) = {x+y}
<console>:16: error: type mismatch;
 found   : A
 required: String
       def add[A](x:A, y:A) = {x+y

【问题讨论】:

    标签: scala types


    【解决方案1】:

    由于A 不受任何限制,它可以是任何类型。具体来说,该类型不一定具有+ 方法(您尝试在方法主体中调用该方法)。然后,编译器尝试找到一些隐式转换,它可能会使用+ 方法将x 转换为某种类型,并找到thisString 隐式转换为String

    implicit final class any2stringadd[A](private val self: A) extends AnyVal {
      def +(other: String): String = String.valueOf(self) + other
    }
    

    所以,方法体就相当于:

    String.valueOf(x).+(y)
    

    然后 - 编译器失败,因为 String.+ 需要一个字符串参数,而 y 不是一个字符串。

    编辑: 要创建“通用”添加函数,您必须以确保可以添加的方式绑定您的类型 A。一种方法是使用 Numeric 类型:

    def add[A : Numeric](x:A, y:A) = { implicitly[Numeric[A]].plus(x, y) }
    

    这意味着您的函数可以被任何类型 A 调用,其中存在隐式 Numeric[A]

    【讨论】:

    • 很好的解释!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    相关资源
    最近更新 更多