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的当前用法是否错误?
事实是,在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中编译。
类似地,您可以将numericFromInt
和numericFromString
替换为
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中没有提示。)>