gpt4 book ai didi

scala - 参数类型+函数需要一个字符串作为第二个参数?

转载 作者:行者123 更新时间:2023-12-01 09:59:53 25 4
gpt4 key购买 nike

class TestClass[T](val x: T) {
def +(other: TestClass[T]) = x + other.x
}

这个定义给我以下编译错误:

错误:类型不匹配;
发现:T
必填:字符串
def +(other: TestClass[T]) = x + other.x

在 Scala 中不能使用 Int 或 Double 作为类型参数并使用加法吗??

最佳答案

首先,错误信息具有误导性。 scalac 尝试在值 x 上找到方法 +。这在 T 类型上不存在,它可以是任何类型。这称为无限类型参数。所以它尝试应用和隐式 View 。 Predef.any2stringadd 符合要求。

您可以禁用此隐式转换,并查看真正的错误:

 ~/code/scratch: cat plus.scala 
import Predef.{any2stringadd => _, _}

class TestClass[T](val x: T) {
def +(other: TestClass[T]) = x + other.x
}
~/code/scratch: scalac plus.scala
plus.scala:4: error: value + is not a member of type parameter T
def +(other: TestClass[T]) = x + other.x
^
one error found

在 C++ 中,类型检查是在提供类型参数后在每个调用点完成的。所以这种代码风格是可行的。在 Scala 中,泛型方法必须在其定义时进行类型检查,仅基于抽象类型的边界。

根据 VonC 的建议,您可能希望提供类型参数 T 上的上下文绑定(bind),以将 if 限制为具有 Numeric 特征的相应实例的类型.

class TestClass[T: Numeric](val x: T) { 
def +(other: TestClass[T]): T = {
val num = implicitly[Numeric[T]]
import num._
x + other.x
}
}

下面是所有隐式都显式化后的样子:

class TestClass[T]{
implicit <paramaccessor> private[this] val evidence$1: Numeric[T] = _;
def this(x: T)(implicit evidence$1: Numeric[T]): TestClass[T] = {
TestClass.super.this();
()
};
def +(other: TestClass[T]): T = {
val num: Numeric[T] = scala.Predef.implicitly[Numeric[T]](TestClass.this.evidence$1);
import num._;
num.mkNumericOps(TestClass.this.x).+(other.x)
}
}

关于scala - 参数类型+函数需要一个字符串作为第二个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3127934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com