我遇到的情况是我从数据库中获取数据,我想将其上传到ArrayList of objects
,然后将其向下转换为不同的自定义ArrayList,即List<User>
,List<Groups>
等。
我的问题是向上转换为对象,然后向下转换为ArrayList,成本是多少,是高效还是良好的做法。
EDITED
我没有将数据作为List<User>, List<Groups>
等获取,而是希望将数据设为ArrayList<objetcs>
一次,然后根据我的需要,我会将数据转发到ArrayList<User>,
ArrayList<Groups>
答案 0 :(得分:5)
“向下投射”并不是一个好主意,因为您不需要使用任何特定于ArrayList的方法。你应该可以使用List
来做每件事。 ArrayList提供的唯一不在List中的公共方法是ensureCapacity
(它看起来没那么有用)和trimToSize
很少有用。
就成本而言,这取决于你是否有可能失败。如果您没有抛出异常,典型的类型检查可能需要约40纳秒。 JIT应该优化Upcast。
答案 1 :(得分:3)
如果数据库实际上没有返回ArrayList
,则转换不会为您转换 - 而是在运行时会看到ClassCastException
。您应该实例化一个您想要使用的类型的新集合,并对从数据库返回的集合调用其addAll(Collection c)
方法。
答案 2 :(得分:2)
如果您从ArrayList<Object>
开始,将此广告投放到ArrayList
不是向上广播:它只是将参数化类型转换为其原始对应项。此外,将ArrayList
投射到ArrayList<String>
不是向下倾斜,或者:未经检查的投射为参数化类型。两者都只是编译器工件并且没有运行时等效。
答案 3 :(得分:2)
如果您getting/saving
的{{1}}个表与database
不同,那么每个table
的每个table
都会为每个table
创建一个完整映射{{1}}的类。然后在(插入,更新,删除,选择)的功能中传递具有相应表类对象的数据。并按原样使用。为此,您必须创建不同的功能以获取或保存数据到表。但它是执行此任务的最有效方式。有关向上/向下转发的更多信息,请参阅链接here
答案 4 :(得分:0)
在性能方面的“成本”几乎为零(唯一的成本是在向下转发的运行时检查中)。
Casting不会更改列表本身,只会更改引用的类型。
以什么形式(数据类型)获取“数据库中的数据”?如果您希望能够从例如一个JDBC ResultSet到List,它不能用于强制转换 - 你实际上需要遍历ResultSet来获取数据。