gpt4 book ai didi

scala - 如何使用 2.13 编译具有隐式和存在类型的代码

转载 作者:行者123 更新时间:2023-12-01 09:36:55 24 4
gpt4 key购买 nike

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 中,不会推断 existentialsOnly(1, "str") 中的 1 具有 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 中。

关于scala - 如何使用 2.13 编译具有隐式和存在类型的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60742420/

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