2016-05-13 2 views
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] { 
            ^

Любые идеи о том, что происходило здесь (/ обходной путь)?

Обновление Судя по всему, существуют значительные ограничения на импорт подстановок в его 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 
+0

Используйте trailing '// show' для печати компилируемого, включая импорт. Отметьте пространство между косой чертой и показом. –

+0

@ som-snytt Возникли проблемы с этим. Я поставил '// show' после кода выше, как вы упомянули. При выполнении ': paste', а затем' ctrl-D' REPL автоматически помещает ': quit' - убивает сеанс. – javadba

ответ

3

Я вижу, что проблема связана с моим использованием Spark REPL spark-shell. Проблема не происходит в обычном Scala REPL.

+1

Искра делает все по-другому и имеет ошибку. https://issues.scala-lang.org/browse/SI-9740 –

+0

@ som-snytt Thx для этого указателя – javadba

2

Хорошие новости: ваш код работает! Плохие новости: я понятия не имею, почему это не работает для вас.

Вот моя сессия 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([[[email protected]) 

Хммм. Работает тривиальный пример.

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([[[email protected]) 
res2: P2pClient.Weights = Array(null, null, null) 

Aaaaand работает, когда он расширяет полиморфный признак и переопределяет один из его членов. Единственное, что может быть другим, это ваше определение P2pReq, но я не вижу, как это может привести к тому, что один из ваших типов не будет распознан интерпретатором.

+1

Huh. Хорошо, что я отвечу на ваш ответ (это полезно), но удержаться на награждении - увидеть, если кто-то еще переживает мое дело, или понимает, что может быть другим. – javadba

+0

О, проблем нет. –

+0

Я добавил свой собственный ответ - это происходит в Spark repl, а не только scala repl. Но я буду награждать вас за указание правильного направления. – javadba

Смежные вопросы