7

我有一种情况,我从数据库中获取数据,我想将它向上转换到ArrayList of objects然后向下转换到不同的自定义 ArrayList ieList<User>List<Groups>

我的问题是向上转换为对象,然后向下转换为 ArrayList,成本是多少,它是有效的还是好的做法。

已编辑

我不想像等那样获取数据,List<User>, List<Groups>我想ArrayList<objetcs>一次获取数据,然后根据我的需要,我将向下转换数据到ArrayList<User>, ArrayList<Groups>稍后。

4

5 回答 5

5

“向下转换”不是一个好主意,因为您不需要使用任何 ArrayList 特定方法。你应该能够使用List每一件事。ArrayList 提供的唯一不在 List 中的公共方法是ensureCapacity(它不像看起来那么有用)并且trimToSize很少有用。

在成本方面,这取决于你是否有可能失败。如果您不抛出异常,典型的类型检查可能需要大约 40 纳秒。Upcast 应该被 JIT 优化掉。

于 2012-12-19T14:22:46.877 回答
3

如果数据库实际上没有返回 a ArrayList,则强制转换不会为您转换它——相反,您会ClassCastException在运行时看到 a 。相反,您应该实例化一个您想要使用的类型的新集合,并addAll(Collection c)在从数据库返回的集合上调用它的方法。

于 2012-12-19T14:22:15.690 回答
2

如果您以 开头,ArrayList<Object>则将其转换ArrayList不是向上转换:它只是将参数化类型转换为其原始对应物。此外,转换ArrayListArrayList<String>也不是 downcast:它是未经检查的转换为参数化类型。两者都只是编译器工件没有运行时等效项

于 2012-12-19T14:28:16.750 回答
2

如果从那时起您是getting/saving 不同的表,database则为每个table首先创建table具有完整映射的类table。然后在(Insert,update,delete,select)的函数中使用相应的表类对象传递数据。并按原样使用。为此,您必须创建不同的函数来获取或保存数据到表中。但这是完成这项任务的最有效方式。有关向上转换/向下转换的更多信息,请参见此处的链接

于 2012-12-20T06:35:51.597 回答
0

性能方面的“成本”几乎为零(唯一的成本是在向下转换的运行时检查中)。

强制转换不会改变列表本身,只会改变引用的类型。

您以什么形式(数据类型)获取“来自数据库的数据”?如果您希望能够从例如 JDBC ResultSet 转换为 List,那么这不适用于强制转换 - 您实际上需要遍历 ResultSet 以获取数据。

于 2012-12-19T14:25:04.793 回答