在Java中将Ada联合类型转换为对象类

在Java中将Ada联合类型转换为对象类,java,ada,Java,Ada,下图为AdaUnion类型(图) 如何将这种联合类型从Ada转换为Java中的Object?请帮帮我 这是代码 首先点击空格,通过定义枚举,然后将所有字段添加到同一对象来实现 class Figure { public enum Shape { Circle, Triangle, Rectangle }; public enum Colors { Red, Green, Blue }; Shape form; boolean Filled; Colors

下图为
Ada
Union类型(图)

如何将这种联合类型从Ada转换为Java中的Object?请帮帮我

这是代码


首先点击空格,通过定义枚举,然后将所有字段添加到同一对象来实现

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;
}

对对象的操作只需要检查“窗体”的值就知道应该考虑哪些字段,以及哪些字段可以忽略。


现在,您已经将这个想法(无论多么粗略)翻译成Java,您可以应用您的Java知识来重复这个想法。

我对指定这样的Ada记录(“联合”)的规范方法有疑问,我总是使用“变体记录”或“判别记录”

根据Ada上下文中的
Union
,Union是指变量记录声明+C约定Union

这是通过引用以下内容来实施的:

指定aspect
Unchecked\u Union
以使值
True
定义给定的鉴别类型某些C Union之间的接口对应关系。 编辑:方面要求关联类型应给出一个表示,该表示不为其判别式分配空间

引用,OP记录声明不是一个并集

带有可变零件的记录类型示例:


请张贴代码,而不是代码的图片。考虑一个java <代码>类< /C> >属性,如“代码> java .Lang.BooLoe<代码> >代码> java .AWT .Cudio< <代码> >代码> java .AWT .Sturt< /Cuff>,然后请您的问题包含一个显示当前方法的内容,您还希望对您想要做的事情有一个更具体的说明。您提供的Ada示例不是一个Union,它在功能上与变体记录(您正在展示的)有很大不同。您可以在Java中模拟变量记录的某些方面,但了解Ada示例为您提供的Java中具体要模拟的功能是很重要的。该图像似乎是一个摘录,其中的一个讲座使用传统的联合进行了分析。完全脱离了OP的主题,第二个@trashgod链接结尾处的状态“与结构类型等效,您无法区分相同结构的类型(例如不同的速度单位,都是浮动)”。Ada2012或更高版本提供了一个非常好的特性,我称之为“维度分析”。基本上,它允许定义单位和映射的数字类型。Ada工具链将具有编译/执行时间类型和单元求解。此外,您还可以考虑将与艾达版本中的case语句中的成员变量对应的成员变量私有化,并使用GETSt/Stter来执行判别检查。尽管这完全取决于OP的实际需求,但尚未更新。
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
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;