我有课Element<T>
包含 T
和一个int
:
class Element<T>{
T obj;
int i;
// ...
}
当没有T
时已存储,我想使用obj
就像指向元素或索引的指针:
obj = someElement;
obj = indexOf(someElement);
当然,我不能这样做,因为 Java 没有联合或变体(如 C++ 变体)并且具有严格的类型系统。
请注意,我希望能够通过 obj 访问元素,但我不想通过 obj 更改它(如果有帮助的话)。
问题:
- 有什么方法可以在不创建我自己的变体的情况下完成此任务 类还是安装一个?
- 如果是这样,那么最有效的内存方法是什么,因为我 需要创建许多元素?
最佳答案
这个小问题是概念性的。 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/