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 中没有发生此问题。
给定以下对象:
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 中没有发生此问题。