3

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 的当前用法是否错误?

4

1 回答 1

1

事情似乎是,在 2.13 中,单例类型的处理方式比在 2.12 中要少一些。

错误

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

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

如果添加提示

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

将在 2.13 中编译。

同样,您可以将numericFromIntandnumericFromString替换为

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 中。

于 2020-03-25T22:47:56.710 回答