scala REPL 中的静态导入

Static imports inside scala REPL

给定以下对象:

scala> object P2pClient {
     |   type Num = Double
     |   type Weights = Array[Array[Num]]
     | }
defined object P2pClient

和以下导入:

import P2pClient._

Weights类型似乎应该被正确理解:

val w: Weights = new Weights(3)
w: P2pClient.Weights = Array(null, null, null)

但是为什么在以下构造中工作:

case class SendWeightsReq(W: Weights) extends P2pReq[Weights] {
     |   override def value() = W
     | }
<console>:12: error: not found: type Weights
       case class SendWeightsReq(W: Weights) extends P2pReq[Weights] {
                                                            ^
<console>:12: error: not found: type Weights
       case class SendWeightsReq(W: Weights) extends P2pReq[Weights] {
                                    ^

对这里发生的事情有什么想法(/解决方法)?

更新 REPL 中的通配符导入似乎存在重大限制。这是另一个更简单的例子:

scala> import reflect.runtime.universe._
import reflect.runtime.universe._

scala> trait TT {  def x[T <: java.io.Serializable : TypeTag]: T }
<console>:10: error: not found: type TypeTag
       trait TT {  def x[T <: java.io.Serializable : TypeTag]: T }
                                                     ^

所以我们看到通配符导入确实没有工作。这是与显式包相同的代码:

scala> trait TT {  def x[T <: java.io.Serializable : reflect.runtime.universe.TypeTag]: T }
defined trait TT

好消息:您的代码有效!坏消息:我不知道为什么它对你不起作用。

这是我的 REPL 会话;我打算建立你的例子,看看有什么坏了,但什么也没做。

scala> object P2pClient { type Num = Int; type Weights = Array[Array[Num]] }
defined object P2pClient

scala> import P2pClient._
import P2pClient._

scala> val x = new Weights(3)
x: Array[Array[P2pClient.Num]] = Array(null, null, null)

scala> case class SendWeights(W: Weights)
defined class SendWeights

scala> val s = new SendWeights(new Weights(3))
s: SendWeights = SendWeights([[I@1cab0bfb)

嗯。简单的例子有效。

scala> case class SendWeights2(w: Weights) { def dubs = w }
defined class SendWeights2

有主体时有效。

scala> trait P2pReq[+T] { def value(): Unit }
defined trait P2pReq

scala> case class SendWeights3(W: Weights) extends P2pReq[Weights] {
override def value() = W }
defined class SendWeights3

scala> val foo = new SendWeights3(new Weights(3))
foo: SendWeights3 = SendWeights3([[I@51dcb805)
res2: P2pClient.Weights = Array(null, null, null)

Aaaaand 在扩展多态特征并覆盖其成员之一时起作用。唯一可能不同的是您对 P2pReq 的定义,但我不明白这会如何导致您的一种类型无法被解释器识别。

我发现问题是由于我使用了 Spark REPL spark-shell。正常的 Scala REPL 中没有发生此问题。