gpt4 book ai didi

hibernate - Grails-将关联的域对象分配到 List vs ArrayList

转载 作者:行者123 更新时间:2023-12-02 14:57:01 24 4
gpt4 key购买 nike

我有这样的关系:

User{
...
hasMany = [tags: Tag]

}

Tag{
...
}

在我的服务中,我有以下代码:
List<Tag> tags = user.tags

但这不起作用,我收到此错误:
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '[com.app.ext.Tag : 1]' with class 
'org.hibernate.collection.PersistentSet' to class 'java.util.List' due to: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: java.util.List(com.app.ext.Tag)
at ConsoleScript15.run(ConsoleScript15:6)

如果我将代码更改为:
ArrayList<Tag> tags = user.tags

它按预期工作!虽然 ArrayListList 的子类.
有什么解释吗?

Grails 版本: 2.3.0

最佳答案

看看 Groovy 的 casting rules .

当您尝试转换的值是集合时,将调用您要转换为的类型的构造函数。所以,对于 ArrayList它隐式调用:

ArrayList<Tag> tags = new ArrayList(users.tags)

对于 List类似于 new List(users.tags)这是不正确的,因为 List是界面。

下面的代码片段显示了同样的问题:
Set<String> mySet = new HashSet<>(['A', 'B'])
ArrayList<String> myList = mySet; // works okay
List<String> myList = mySet; // fails with GroovyCastException

但是您可以显式转换为 ArrayList :
List<String> myList = mySet as ArrayList; 

关于hibernate - Grails-将关联的域对象分配到 List vs ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29092983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com