如何在Java中将List<Object>转换为List<Dog>

3

如何将List转换为List。我尝试通过以下方式实现:

List<Object> obj = (some initialization)
List<Dog> dog =(List<Dog>)obj;  

所以这会抛出一个错误。

ERROR: Cannot cast from List<Object> to List<Dog>

Where

 List<Object> 

我从Hibernate查询中获取到了数据

FROM DOG 

如果您正在使用Hibernate,请使用TypedQuery。 - Gaurav Jeswani
2
射击狗。变成对象。 - Stanley Mungai
在具体类型之间进行强制转换。 - ZhongYu
2个回答

6

迭代 List<Object> 并显式地将每个项转换为所需类型

List<Dog> dog = new ArrayList<Dog>;
for (Object o : obj)
    dog.add((Dog) o);

1
如果需要迭代超过一万个项目的列表,这样做是否高效? - Syed Hassan
@SyedHassan 我刚刚尝试了一下,用 20000 个被转换为String的对象,只需要 4 毫秒。所以我认为速度应该足够快;) - Parker_Halo
1
如果列表包含非狗对象,则会出现“ClassCastException”异常,否则也可以安全地将列表强制转换(请参见我的答案),而无需创建列表的副本。 - wero
@wero 这是真的,但 SyedHassan 从 Hibernate 查询中获取他的对象,正如他所说,所以应该没问题! - Parker_Halo
你还可以创建一个只读的包装器 List<Dog>,在 get() 方法中检查类型。这很容易通过继承 AbstractList 来实现。 - ZhongYu

2

如果您使用 List<?>,则该转换函数就可以正常工作:

List<?> list = (some initialization);
List<Dog> dog = (List<Dog>)list;

如果你有一个 List<Object>,你仍然可以将其转换为 List<Dog>
List<Object> list = (some initialization);
List<Dog> dog = (List)list;

当您确定列表实际包含 Dog 对象时(例如作为来自您的 HQL 查询 FROM Dog 的结果值),才应执行此操作。


2
你可能会从这个地方得到一些警告...如果我没记错的话,类似于未检查的类型转换。 - Parker_Halo
1
@Parker_Halo 是的,当你将 Object 强制转换为 Dog 时也会收到相同的警告。 - wero
你确定吗?我刚在我的Eclipse中尝试了一下,没有任何警告出现... - Parker_Halo
它给了我警告,但我认为我应该忽略它,因为我正在从Hibernate查询中获取记录。 - Syed Hassan
@Parker_Halo,你是对的,它确实不行。 - wero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接