тип несоответствие Рекурсивный метод вызова RDD в искры apache [дубликат]

Я хорошо объясню это на примере. предположим, что мы имеем следующий союз:

union A{
   int x;
   short y[2];
};

Я полагаю, что sizeof(int) дает 4, а sizeof(short) дает 2. когда вы пишете union A a = {10}, чтобы создать новый var типа A вставьте в него значение 10.

ваша память должна выглядеть так: (помните, что все члены союза получают одно и то же местоположение)

       |                   x                   |
       |        y[0]       |       y[1]        |
       -----------------------------------------
   a-> |0000 0000|0000 0000|0000 0000|0000 1010|
       -----------------------------------------

, как вы могли видеть, значение ax равно 10, значение ay 1 равно 10, а значение ay [0] равно 0.

теперь, что хорошо, если я это сделаю?

a.y[0] = 37;

наша память будет выглядеть так:

       |                   x                   |
       |        y[0]       |       y[1]        |
       -----------------------------------------
   a-> |0000 0000|0010 0101|0000 0000|0000 1010|
       -----------------------------------------

это превратит значение ax в 2424842 (в десятичном виде). ​​

теперь, если ваш союз имеет float или double, ваша карта памяти будет скорее беспорядочной, потому что вы храните точные числа. более подробную информацию вы можете получить в здесь .

4
задан zero323 27 May 2016 в 08:15
поделиться

1 ответ

Вот трюк. Позволяет открыть 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, вы должны отслеживать созданные вами сущности и, если изменения типов определений, убедитесь, что неопределенные определения не сохраняются (переписывайте вещи, если необходимо), прежде чем продолжить.

4
ответ дан zero323 17 August 2018 в 22:10
поделиться
  • 1
    Из этого ответа неясно, как автор должен решить свою проблему. Кажется, это только показывает, как создать аналогичное сообщение об ошибке с использованием другого кода. – GeorgeLewis 26 August 2016 в 18:08
  • 2
    @GeorgeLewis Спасибо за отзыв. Thing ism - это ожидаемое поведение. Просто сообщение об ошибке не очень понятно. Помимо сохранения состояния REPL в чистом виде и удаления / переопределения двусмысленных определений здесь нечего делать. – zero323 26 August 2016 в 21:07
  • 3
    Я думаю, что это была просто ошибка в том, как история импортировалась в текущей строке, где искровая оболочка использует -Yrepl-class-based и исправлена ​​в scala 2.11.9+. – som-snytt 23 May 2018 в 22:07
Другие вопросы по тегам:

Похожие вопросы: