java - 是否有任何等效于 C 联合或 C++ std::variant 的内存高效 Java?
问题描述
我有一个Element<T>
包含 aT
和 an的类int
:
class Element<T>{
T obj;
int i;
// ...
}
当没有T
存储时,我想使用obj
指向元素或索引的指针:
obj = someElement;
obj = indexOf(someElement);
当然,我不能这样做,因为 Java 没有联合或变体(如 c++ 变体)并且有严格的类型系统。
请注意,我希望能够通过 obj 访问元素,但我不想通过 obj 更改它,如果有帮助的话。
问题:
- 有没有办法在不创建我自己的变体类或安装一个变体类的情况下实现这一点?
- 如果是这样,那么最节省内存的方法是什么,因为我需要创建许多元素?
解决方案
解决此问题的一种方法是使用接口或具有继承的超类。
例如,如果我们有以下 Java 接口:
interface Element<T> {
T getValue();
}
那么任何实现该Element
接口的类都需要提供一个返回元素值的方法。
我们可以实现一个存储T
类型对象并返回它的类:
class ElementObject<T> implements Element<T> {
private T object;
T getValue() {
return object;
}
}
或者我们可以实现一个存储索引并使用它的类(结合一些大的对象列表):
class ElementIndex<T> implements Element<T> {
private int index;
T getValue() {
return bigListOfObjects.get(index);
}
}
现在您可以创建一个列表或数组或Element
s,其中一些可能是ElementObject
s,一些可能是ElementIndex
s,但它们都可以根据需要提供对元素的访问,而其中任何一个都不会浪费任何字段。
推荐阅读
- postgresql - 每次新构建数据库后,给定模式中的数据都会被截断 4 次
- java - 字符串格式在 Android Studio 的 ListView 中显示不正确
- python - 如何使用我自己的数据在“Floydhub”上运行“Pix2Pix”代码的训练/测试命令?
- nginx - 如何在 nginx 中将 https 重定向到 http
- css - 是否可以使用引导程序 4 类设置 css 属性顶部、底部、左侧和右侧?
- customization - 如何在 Acumatica 的案例模块中添加可搜索的 InventoryID(用户定义字段)?
- python - Python Flask:用户下载抓取的图像
- linux - Linux管道读/写总是会导致上下文切换吗?
- c# - 如何使默认值突出显示或集中在下拉列表列表中
- python - 如何在 Gurobi 中正确实现成本最小化目标函数?