【发布时间】:2020-09-09 02:14:35
【问题描述】:
以下代码无法在 Scala 2.12 / 2.13 上编译。为什么?
class X[U, T]
object X {
implicit def genericX[U, T](implicit ev: T <:< U): X[U, T] = new X[U, T]
}
implicitly[X[AnyRef, String]] // compiles
implicitly[X[String, Nothing]] // does not compile
【问题讨论】:
-
感谢@dmytro-mitin,我知道
+T解决了这个问题,但不幸的是,这不是我可以接受的。事实上,我想要T逆变,但即使在不变量的情况下也卡住了。 -
为什么需要
X?现在它基本上是<:<的同义词。为什么不能直接使用<:<?为什么需要为Nothing解析隐式?Nothing如何出现在您的代码中? -
有点复杂,和stackoverflow.com/questions/61890200/…有关。最终我想有一个方法
def check[T](....): A[T] = ???以便check(...)返回A[Any]而check[String](...)返回A[String]。 (即Any推断为默认类型,而不是Nothing)。我尝试了以下方法:def check[T](implicit ev: X[Any, T]): A[T] = ???因此X[U, -T]. -
感谢您的反馈!让我画出整个画面:
A[T]在内部捕获ClassTag[T]。我正在寻找一种方法def attribute[T](s: String): A[T],它在缺少T时返回A[SomeDefaultType](或者甚至Any,以使事情变得更简单)。我确实有一个可行的解决方案 (gist.github.com/kamilkloch/a5c97d0c7cdec47f8dc4c4ac4c131674),但是,它需要一个中间类来咖喱类型参数。我希望通过上述X[U, -T]摆脱它。