如何使用2.13隐式和存在类型编译代码

问题描述 投票:3回答:1

upd我有一个函数接受存在的类型:

trait QueryValue[V]

trait QueryValueFormats {
  implicit object IntQueryValue extends QueryValue[Int]
  implicit object StringQueryValue extends QueryValue[String]
}

trait Magnets {
  trait NumericCol[C]
  implicit def numericFromInt[T <: Int](s: T)(implicit evidence: QueryValue[T]): NumericCol[T] = new NumericCol[T] {}
  implicit def numericFromString[T <: String](s: T)(implicit evidence: QueryValue[T]): NumericCol[T] = new NumericCol[T] {}
}

object Hello extends App with  Magnets with QueryValueFormats {
  //function accept only existentials
  def existentialsOnly(coln: NumericCol[_]*): Unit = println("stub")

  existentialsOnly(1, "str")//not compiles
}

它以2.12编译,但是以2.13编译-否:

[error] ..//Hello.scala:21:20: type mismatch;
[error]  found   : Int(1)
[error]  required: example.Hello.NumericCol[_]
[error]   existentialsOnly(1, "str")
[error] 

我尝试删除存在性(只需尝试一下):

def existentialsOnly[T: ClassTag](coln: NumericCol[T]*): Unit

并且此代码可编译,但是如果coln仅具有单一类型。例如:

existentialsOnly("str", "str")

所以,在第一种情况下如何正确使用存在性? 2.13的当前用法是否错误?

scala implicit existential-type singleton-type scala-2.13
1个回答
1
投票

事实是,在2.13中,单例类型比在2.12中被保守地对待。

错误

Error: type mismatch;
 found   : Int(1)
 required: App.Hello.NumericCol[_]
    existentialsOnly(1, "str")

意味着在2.13中,不能推断出1中的existentialsOnly(1, "str")具有类型Int(因此由于隐式转换而具有NumericCol[Int])而不是单例类型Int(1)

如果添加提示

existentialsOnly(1: Int, "str": String)

将在2.13中编译。

类似地,您可以将numericFromIntnumericFromString替换为

implicit def numericFrom[U, T <: U](s: T)(implicit evidence: QueryValue[U]): NumericCol[T] = new NumericCol[T] {}

implicit def numericFrom[T](s: T)(implicit evidence: QueryValue[_ >: T]): NumericCol[T] = new NumericCol[T] {}

在2.12和2.13中都具有,但>]

implicit def numericFrom[T](s: T)(implicit evidence: QueryValue[T]): NumericCol[T] = new NumericCol[T] {}

(仅在2.12中没有提示。)>

© www.soinside.com 2019 - 2024. All rights reserved.