【发布时间】:2014-05-21 09:13:01
【问题描述】:
为什么这不能用类型参数编译:
错误:value explode 不是 Test.A[Nothing] 的成员
如果我删除它们,那么它会编译。我不明白什么,更重要的是,我能做些什么来解决它。
object Test extends App {
implicit class B[E](set: A[E]) {
def explode() = println("boom")
}
case class A[E](name: String)
A[Nothing]("coldplay").explode()
}
(本例中的类型参数不做任何事情,但在现实世界的用例中,我有多个类型参数,有些可以是 Nothing,有些不是)。
【问题讨论】:
-
显然,直接将类型参数设置为
Nothing是导致问题的原因:裸A("coldplay").explode()(实际上是A[Nothing])和任何其他指定类型,例如,A[String]("coldplay").explode()工作得很好。至于“为什么”,我会等待其他人回答,只是因为我不知道...... :) -
是的,我在现实世界的用例中没有使用任何东西,这就是它开始爆炸的时候。
-
如果您使用
-Xlog-implicit-conversions和-Xlog-implicits,您可以获得更多信息。看起来A("coldplay").explode()有效,因为在解析类型参数之前应用了隐式转换。对于A[Nothing]("coldplay").explode(),编译器拒绝将Nothing推断为B的类型参数,尽管我不知道为什么。