Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala 2.13自动隐式解析错误_Scala_Scala Collections_Implicit_Scala 2.13 - Fatal编程技术网

scala 2.13自动隐式解析错误

scala 2.13自动隐式解析错误,scala,scala-collections,implicit,scala-2.13,Scala,Scala Collections,Implicit,Scala 2.13,我面临着与scala隐式解析相关的奇怪问题 下面是代码片段 import scala.collection.Factory import scala.collection.immutable.Seq sealed trait A sealed trait B case class BImpl() extends B case class AImpl() extends A object implicitsContainer { type AB = (A, B) implic

我面临着与scala隐式解析相关的奇怪问题

下面是代码片段

import scala.collection.Factory
import scala.collection.immutable.Seq

sealed trait A

sealed trait B

case class BImpl() extends B

case class AImpl() extends A

object implicitsContainer {

  type AB = (A, B)

  implicit def toStringAnyTuples[C[X] <: Iterable[X], A <: AB]
  (col: C[A])
  (implicit factory: Factory[(String, Any), C[(String, Any)]])
  : C[(String, Any)] = {

    factory.fromSpecific(col.iterator.map(f => f._1.toString -> f._2))
  }
}

object Main extends App {

  import implicitsContainer._

  def a(f: Seq[(String, Any)]): Seq[(String, Any)] = f

  val w: Seq[(AImpl, BImpl)] = Seq(AImpl() -> BImpl())

  val x: Seq[(String, Any)] = a(w)

  //    Won't compile
  //    val y: Seq[(String, Any)] = a(Seq(AImpl() -> BImpl()))
}
但这是一个错误

val y: Seq[(String, Any)] = a(Seq(AImpl() -> BImpl()))
错误是:-

Error:(44, 47) type mismatch;
 found   : (AImpl, BImpl)
 required: (String, Any)
    val y: Seq[(String, Any)] = a(Seq(AImpl() -> BImpl()))
还有一点,如果我从w

  val w = Seq(AImpl() -> BImpl())

  val x: Seq[(String, Any)] = a(w)
那么这也会很好的工作。 唯一的错误是

val y: Seq[(String, Any)] = a(Seq(AImpl() -> BImpl()))
我正在使用:-

SCALA->2.13.3

SBT->1.3.13


JAVA->14

这只是类型推断问题。未推断
Seq.apply
的类型参数。试一试

val y: Seq[(String, Any)] = a(Seq[(AImpl, BImpl)](AImpl() -> BImpl()))


这只是类型推断的问题。未推断
Seq.apply
的类型参数。试一试

val y: Seq[(String, Any)] = a(Seq[(AImpl, BImpl)](AImpl() -> BImpl()))


您所经历的是Scala编译器中推理工作方式的症状。 下面是一个较小的示例,显示了相同的问题:

object Test {
  class C[T](x: T)
  implicit def conv(c: C[Int]): C[String] = ???
  def m(cs: C[String]) = 1
  val ci = new C(1)
  def t1: Int = m(ci)       // OK
  def t2: Int = m(new C(1)) // found: Int, expected: String
}
当类型检查
newc(1)
时,编译器将期望的类型
String
下推到type 检查表达式
1
,该表达式失败。在上面的行中,使用预期类型检查
ci
C[String]
由于隐式转换而成功。 我的建议是定义一个执行转换的扩展方法 使转换隐式。为了清晰起见,也建议这样做-隐式转换,如 您的示例中定义的问题可能会导致意外的、难以诊断的问题。 在我的示例中,它将如下所示:

object Test {
  class C[T](x: T)
  implicit class CExt(private val c: C[Int]) extends AnyVal {
    def toCString: C[String] = ???
  }
  def m(cs: C[String]) = 1
  val ci = new C(1)
  def t1: Int = m(ci.toCString)
  def t2: Int = m(new C(1).toCString)
}

您所经历的是Scala编译器中推理工作方式的症状。 下面是一个较小的示例,显示了相同的问题:

object Test {
  class C[T](x: T)
  implicit def conv(c: C[Int]): C[String] = ???
  def m(cs: C[String]) = 1
  val ci = new C(1)
  def t1: Int = m(ci)       // OK
  def t2: Int = m(new C(1)) // found: Int, expected: String
}
当类型检查
newc(1)
时,编译器将期望的类型
String
下推到type 检查表达式
1
,该表达式失败。在上面的行中,使用预期类型检查
ci
C[String]
由于隐式转换而成功。 我的建议是定义一个执行转换的扩展方法 使转换隐式。为了清晰起见,也建议这样做-隐式转换,如 您的示例中定义的问题可能会导致意外的、难以诊断的问题。 在我的示例中,它将如下所示:

object Test {
  class C[T](x: T)
  implicit class CExt(private val c: C[Int]) extends AnyVal {
    def toCString: C[String] = ???
  }
  def m(cs: C[String]) = 1
  val ci = new C(1)
  def t1: Int = m(ci.toCString)
  def t2: Int = m(new C(1).toCString)
}

什么是“测试”。av?你没有在任何地方定义
.av
。很抱歉,我只是重新编辑了代码。什么是
“test”.av
?您没有在任何地方定义
.av
。很抱歉,我刚刚重新编辑了代码。有没有办法显式忽略传递的类型参数?例如使用另一个隐式方法或更新旧的隐式方法?@Divyanshu不确定。为编译器提供提示(如显式指定类型参数或类型归属)是改进Scala中未推断某些类型时的类型推断的标准方法。此外,不建议使用隐式转换(与隐式的其他用法相反)。是否有任何方法可以显式忽略传递类型参数?例如使用另一个隐式方法或更新旧的隐式方法?@Divyanshu不确定。为编译器提供提示(如显式指定类型参数或类型归属)是改进Scala中未推断某些类型时的类型推断的标准方法。此外,不建议使用隐式转换(与隐式的其他用法相反)。