首页 > 解决方案 > 是否有任何等效于 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 更改它,如果有帮助的话。

问题:

  1. 有没有办法在不创建我自己的变体类或安装一个变体类的情况下实现这一点?
  2. 如果是这样,那么最节省内存的方法是什么,因为我需要创建许多元素?

标签: javareinterpret-casttype-systems

解决方案


解决此问题的一种方法是使用接口或具有继承的超类。

例如,如果我们有以下 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);
     }
  }

现在您可以创建一个列表或数组或Elements,其中一些可能是ElementObjects,一些可能是ElementIndexs,但它们都可以根据需要提供对元素的访问,而其中任何一个都不会浪费任何字段。


推荐阅读