В целом плохая практика - указывать конкретный класс в качестве типа объявления как в объявлениях переменных, так и в сигнатурах методов. Если вам действительно не нужен ArrayList, оставьте его как List, чтобы обеспечить большую гибкость.
Я не совсем уверен, что здесь происходит, но Hibernate имеет свои собственные классы коллекций, которые он использует для отображаемых коллекций, наиболее часто используемые это org.hibernate.collection.PersistentList
и org.hibernate.collection.PersistentSet
. Они реализуют интерфейсы List и Set соответственно, но не расширяют ArrayList или HashSet или какую-либо типичную конкретную коллекцию. Вместо этого они являются внутренними классами Hibernate, которые отслеживают изменения, чтобы помочь в обнаружении ошибок при сохранении, сбросе и т. Д.
Хорошо объявить начальную коллекцию как ArrayList, так как она читается только при сохранении (хотя это Groovy, поэтому намного проще использовать List<RoleTool> roleTools = []
). Но Hibernate нуждается в гибкости реализации интерфейса List / Set при загрузке постоянных экземпляров.