java - 是否存在与 C union 或 C++ std::variant 等效的内存高效 Java?

标签 java reinterpret-cast type-systems

我有课Element<T>包含 T和一个int :

class Element<T>{
    T obj;
    int i;
    // ...
}

当没有T时已存储,我想使用obj就像指向元素或索引的指针:

obj = someElement;
obj = indexOf(someElement); 

当然,我不能这样做,因为 Java 没有联合或变体(如 C++ 变体)并且具有严格的类型系统。

请注意,我希望能够通过 obj 访问元素,但我不想通过 obj 更改它(如果有帮助的话)。

问题:

  1. 有什么方法可以在不创建我自己的变体的情况下完成此任务 类还是安装一个?
  2. 如果是这样,那么最有效的内存方法是什么,因为我 需要创建许多元素?

最佳答案

这个小问题是概念性的。 java中的对象只是堆上的一些内存,它的“地址”存储在对象字段中。

class MyUnion {
    Object any;
}

MyUnion u = new MyUnion();
u.any = "hello";
u.any = Integer.valueOf(13);

上面的构造是“地址”的联合,而不是数据的联合。

最接近联合的是字节数组,包装在 ByteBuffer 中。

ByteBuffer u = ByteBuffer.allocate(8);
u.putDouble(0, 3.14);
long x = u.getLong(0);

对于真正的对象,必须以某种形式“序列化”它们:

String obj = "Ĉeĥoslovakio";
byte[] b = obj.getBytes(StandardCharsets.UTF_8);
u.putInt(b.length);
u.put(b);

对于复杂的二进制数据,我们可以使用 ASN 或任何其他系统技术。

所以这是概念性的。您没有在堆栈上布局任何对象(某些 JVM 偷偷地这样做),并且:对象是间接的

关于java - 是否存在与 C union 或 C++ std::variant 等效的内存高效 Java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69576334/

相关文章:

Java 代码意外地将 "&#13"附加到行尾

haskell - 如何轻松应对Haskell上的类型系统?

language-agnostic - 编码为通用时编码与使用存在类型

Java ListSet 某处?

java - 用于存储多架飞机的 GPS 位置列表的数据库结构

java - 是否有每个选项卡都不同的 session bean(Java/JSF 托管 bean,而不是浏览器 session )

c++ - C++ 中数组对象的隐式类型转换

c++ - 使用 constexpr 绕过重新解释强制转换限制

c++ - 使用 reinterpreter_cast 读写二进制文件

haskell - Haskell 中的类型和类型变量