Преобразование типа Ada Union в класс Object в Java

На рисунке ниже показан тип соединения Ada (рисунок).

Как я могу преобразовать этот тип Union из Ada в Object в Java? Пожалуйста помогите.

Это код

Преобразование типа Ada Union в класс Object в Java

Пожалуйста, разместите код, а не картинки кода. Рассмотрим Java class с такими атрибутами, как java.lang.Boolean, java.awt.Color, java.awt.Shape и т. д. Затем, пожалуйста, редактировать ваш вопрос, чтобы включить минимальный воспроизводимый пример, который показывает ваш текущий подход.

trashgod 26.12.2018 10:10

Вы также хотите быть более конкретными в том, чем вы хотите заниматься. Пример Ada, который вы предоставляете, не является Union, который по функциям сильно отличается от вариантной записи (которую вы показываете). Вы можете эмулировать некоторые аспекты вариантной записи в Java, но было бы важно знать, какие функции конкретно вы хотите эмулировать в Java, которые предоставляет вам пример Ada.

Jere 26.12.2018 15:59

Изображение похоже на отрывок из CS 354, лекция которого исследует вопросы дизайна с традиционными союзами.

trashgod 27.12.2018 23:18

Совершенно не по теме OP, вторая ссылка @trashgod в конце утверждает: «При эквивалентности структурных типов вы не можете различать типы одной и той же структуры (например разные единицы скорости, оба плавают)». Ada 2012 и выше предоставляет очень приятную функцию, которую я бы назвал «анализом измерений». По сути, он позволяет определять как единицы, так и отображаемый числовой тип. Тогда инструментальная цепочка Ada будет иметь решение блока и типа времени компиляции / выполнения. Более подробный обзор здесь adacore.com/gems/gem-136-how-tall-is-a-kilogram

LoneWanderer 21.12.2019 01:08

См. Также Преобразование различных типов единиц в библиотеке JScience.

trashgod 21.12.2019 19:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
277
2

Ответы 2

Начните с использования места и реализации этого, определив перечисления, а затем добавив все поля к одному и тому же объекту.

class Figure {
    public enum Shape { Circle, Triangle, Rectangle };
    public enum Colors { Red, Green, Blue };
    Shape form;
    boolean Filled;
    Colors color;
    float Diameter;
    int Leftside, Rightside;
    float Angle;
    int Side1, Side2;
}

Операции с объектом просто должны проверять значение 'form', чтобы знать, какие поля они должны учитывать, а какие игнорировать.

Теперь, когда вы перевели идея (хотя и приблизительно) на Java, вы можете применить свои знания Java для повторения идеи.

Вы также можете сделать частные переменные-члены, соответствующие переменным в операторе case в версии Ada, и использовать геттеры / сеттеры для принудительной проверки дискриминанта. Хотя все зависит от реальных требований OP, которые не обновлялись.

Jere 03.01.2019 22:01

У меня есть сомнения относительно канонического способа обозначения таких записей Ada («союзов»), я всегда использовал «вариантную запись» или «дискриминантную запись».

Согласно https://en.wikibooks.org/wiki/Ada_Programming/Types/record#UnionUnion в контексте Ada относится к объявлению вариантной записи + объединение соглашения C.

Это обеспечивается ARM §B.3.3, цитируя:

Specifying aspect Unchecked_Union to have the value True defines an interface correspondence between a given discriminated type and some C union. EDIT: The aspect requires that the associated type shall be given a representation that allocates no space for its discriminant(s).

type T (Flag : Boolean := False) is
   record
       case Flag is
           when False =>
               F1 : Float := 0.0;
           when True =>
               F2 : Integer := 0;
       end case;
    end record
    with Unchecked_Union;
32/2
X : T;
Y : Integer := X.F2; -- erroneous

Цитируя ARM § 3.8.1, объявление записи OP НЕ является объединением.

Example of record type with a variant part:

type Device is (Printer, Disk, Drum);
type State  is (Open, Closed);
type Peripheral(Unit : Device := Disk) is
   record
      Status : State;
      case Unit is
         when Printer =>
            Line_Count : Integer range 1 .. Page_Size;
         when others =>
            Cylinder   : Cylinder_Index;
            Track      : Track_Number;
         end case;
      end record;

Другие вопросы по теме