首页 文章

scala REPL中的静态导入

提问于
浏览
2

给出以下对象:

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] {
                                    ^

关于这里发生的事情的任何想法(/解决方法)?

Update 对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

2 回答

  • 3

    我看到问题是由于我使用 Spark REPL spark-shell . 这个问题在正常的Scala REPL中没有发生 .

  • 2

    好消息:您的代码有效!坏消息:我不知道为什么它不适合你 .

    这是我的REPL Session ;我打算 Build 你的榜样,看看发生了什么,但没有做到 .

    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 的定义,但是我没有看到这可能导致你的一个类型被解释器无法识别 .

相关问题