Чтобы решить эту проблему, я импортировал некоторые JAR-файлы в свой проект:
http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3. 0 / jaxb-api-2.3.0.jar
http: //search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-core/2.3.0/jaxb-core-2.3.0.jar
Вот трюк. Позволяет открыть REPL и определить класс:
scala> case class Foo(i: Int)
defined class Foo
и простую функцию, которая работает с этим классом:
scala> def fooToInt(foo: Foo) = foo.i
fooToInt: (foo: Foo)Int
переопределить класс:
scala> case class Foo(i: Int)
defined class Foo
и создать экземпляр:
scala> val foo = Foo(1)
foo: Foo = Foo(1)
Все, что осталось, - вызвать fooToInt
:
scala> fooToInt(foo)
<console>:34: error: type mismatch;
found : Foo(in class $iwC)(in class $iwC)(in class $iwC)(in class $iwC)
required: Foo(in class $iwC)(in class $iwC)(in class $iwC)(in class $iwC)
fooToInt(foo)
Он выглядит знакомым? Еще один трюк, чтобы лучше понять, что происходит:
scala> case class Foo(i: Int)
defined class Foo
scala> val foo = Foo(1)
foo: Foo = Foo(1)
scala> case class Foo(i: Int)
defined class Foo
scala> def fooToInt(foo: Foo) = foo.i
<console>:31: error: reference to Foo is ambiguous;
it is imported twice in the same scope by
import INSTANCE.Foo
and import INSTANCE.Foo
def fooToInt(foo: Foo) = foo.i
. Короче говоря, это ожидаемое, хотя и слегка запутанное поведение, которое возникает из неоднозначных определений, существующих в той же области.
Если вы не хотите периодически :reset
REPL state, вы должны отслеживать созданные вами сущности и, если изменения типов определений, убедитесь, что неопределенные определения не сохраняются (переписывайте вещи, если необходимо), прежде чем продолжить.