Ошибка Scala: признак существует, но у него нет сопутствующего объекта

У меня ситуация примерно такая:

package A

trait A1{
 def a2 = 0
}

package B

trait B1{
 def b2 = {
  import A.A1._ // Error: trait A1 exists, but it has no companion object
  a2
 }
}

Это может быть не очень хороший дизайн, но в будущем он будет изменен. Есть ли способ обойти эту ошибку?


2 401
1

Ответ:

Решено

Вы не можете импортировать из определения признака. Но можно импортировать из экземпляра определения признака. A1 - это черта

Проблема

import A.A1._ 

Вышеприведенное утверждение недействительно. Когда A.A1._ импортируется, компилятор Scala ищет объект A1, но A1 является признаком, а A1 недоступен. Поэтому он жалуется, что у трейта A1 нет сопутствующего объекта.

Companion object is the object with the same name as class/trait definition

Если вы хотите импортировать признак A1 (определение признака) в область видимости. Просто делать

import A.A1

Вы можете импортировать внутреннюю часть объекта / сопутствующего объекта

object Bar {      
  val x = 1    
}

import Bar._

Теперь x доступен в объеме

Если Foo является объектом, то import Foo._ действителен.

Scala REPL

scala> trait A { val a = 1}
defined trait A

scala> val foo = new A{}
foo: A = $anon$1@9efcd90

scala> import foo._
import foo._

scala> a
res0: Int = 1