gpt4 book ai didi

scala - 泛型类型的隐式转换?

转载 作者:行者123 更新时间:2023-12-04 12:08:42 24 4
gpt4 key购买 nike

考虑这个功能:

def justTrue[T, S](seq: S)(implicit ev: S <:< Seq[T]) = true
justTrue(List(1,2,3))
>> true

有用。但是为什么不能使用相同的签名作为隐式转换呢?
implicit class TruthTeller[T, S](seq: S)(implicit ev: S <:< Seq[T]) {
def justTrue = true
}
List(1,2,3).justTrue
>> error: Cannot prove that List[Int] <:< Seq[T].

隐式转换不就是一个函数吗?

最佳答案

你是完全正确的,这应该在隐式 def 中也能正常工作。/class .

这是一个错误,其中类型参数意外地从隐式 View 的参数中进行了类型推断:

SI-7944: type variables escape into the wild

它现在从 2.11.0-M7 开始修复:

Welcome to Scala version 2.11.0-M7 (OpenJDK 64-Bit Server VM, Java 1.7.0_45).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :pa
// Entering paste mode (ctrl-D to finish)
implicit class TruthTeller[T, S](seq: S)(implicit ev: S <:< Seq[T]) {
def justTrue = true
}
List(1,2,3).justTrue
// Exiting paste mode, now interpreting.

defined class TruthTeller
res0: Boolean = true

至于解决方法,有很多,你可以在你的答案中使用更高级的,或者例如强制推理 T来自 seq范围:
// the implicit ev isn't even needed here anymore
// but I am assuming the real use case is more complex
implicit class TruthTeller[T, S](seq: S with Seq[T])(implicit ev: S <:< Seq[T]) {
def justTrue = true
}
// S will be inferred as List[Int], and T as Int
List(1,2,3).justTrue

关于scala - 泛型类型的隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20729190/

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