如何在Java中使用动态数据类型的变量?

时间:2010-05-21 12:41:48

标签: java inheritance dynamic-variables

我需要一个UserProfile类,就是那个用户个人资料。这个用户配置文件当然有一些重要的用户数据,但它也需要有用户朋友发送的消息列表。

我需要在LinkedListArrayListHashMapTreeMap中保存这些消息。但是每次只能有一个而不是为每个数据结构复制消息。基本上,像动态变量类型,我可以选择消息的数据类型。

这在某种程度上可以用Java吗?或者我最好的方法是like this?我的意思是,有两个不同的类(对于用户配置文件),一个我将消息作为Map<K,V>托管(然后我在适当的地方使用HashMapTreeMap)和另一个我在哪里的类托管他们List<E>(然后我恰当地使用LinkedListArrayList。并且可能使用UserProfile的超类,所以我不必为数据,年龄,地址等字段复制变量和方法......

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

首先,您不是通过将消息同时添加到不同的集合来复制消息 - 您只将不同的引用存储到同一对象。 (好吧,除非消息被表示为像long这样的基本类型......但是无论如何都不能将它们添加到集合中。)

为什么不能在同一个UserProfile中拥有所有这些集合?这将允许您按键或索引访问消息,并以您喜欢的方式迭代它们。

对于你来说,LinkedHashMap也可能是一个有趣的选项,因为它保证了迭代顺序,所以在某种程度上它的行为类似于关于迭代的List,同时仍然是Map。归根结底,它归结为您希望如何访问给定用户的消息,而这些消息尚未详细说明。

更新: @Snake,您只能存储对Java集合中对象的引用。因此,只能通过首先转换为long对象来直接存储原始Long值。请注意,从Java5开始,这种转换可能由于自动装箱而隐含,因此您在代码中看不到它,但它仍然会发生 - 例如。

List<Long> list = new ArrayList<Long>();
list.add(1L); // the primitive value is boxed into a Long object,
              // which is then added to the list
long value = list.get(0); // the value of the Long object in the list is outboxed
                          // and assigned to the primitive variable

答案 1 :(得分:0)

如果这是一个大学项目,那么我怀疑你打算做的是:

Collection mycoll;
mycoll = new ArrayList();
for (Message m:message) {
  // do stuff and measure the performance
}
// do other stuff and measure the performance
mycoll = new LinkedList();
// do the same stuff as a above and measure the performance again
mycoll = new HashMap();
//... and so on

如上所述,将对象添加到集合中不会复制它。

答案 2 :(得分:0)

我最终使用了我在第一篇文章中描述的内容:

  

这在某种程度上可以用Java吗?要么   我最好的方法是这样的   这个?我的意思是,有两个不同的类   (对于用户个人资料),我在哪里   将消息作为Map托管(和   然后我用HashMap和TreeMap在哪里   适当的)和另一个班级   我将它们作为List托管(然后我使用   LinkedList和ArrayList在哪里   适当地)。并且可能使用了   UserProfile的超类,所以我   不必重复变量和   数据,年龄等领域的方法,   地址等......