【发布时间】:2025-12-15 01:50:01
【问题描述】:
我有 scala+java 项目,其中一些 POJO 类是用 Java 编写的,控制器是用 Scala 编写的。 所以我有一个实体:
@Entity @Table
public class SomeEntity extends GenericEntity {
//... some fields
@OneToMany(...)
private List<SomeOtherEntity> someOtherEntities;
// getters, setters
}
以及以下 scala 代码:
val otherEntity = // construct object of type SomeOtherEntity
val entity = //got entity from database
entity.getSomeOtherEntities.add(otherEntity)
最后一行在java.util.AbstractList.add 处生成java.lang.UnsupportedOperationException。我使用了一些调试器魔法,发现entity.getSomeOtherEntities 的类型为Wrappers$SeqWrapper。是否有简单的 scala 方法可以将项目添加到 scala 中的 java 列表? Ofc 我可以构造新的 java.util.List 并将所有项目添加到其中,然后在实体类中使用字段设置器,但是有没有简单的方法?
【问题讨论】:
-
你可以把
private List<SomeOtherEntity> someOtherEntities;改成private ArrayList<SomeOtherEntity> someOtherEntities;。 -
这看起来像是您的 Java 代码而不是 Scala 代码中的问题。您是否成功地从 Java 调用
SomeEntity#getSomeOtherEntities.add?根据您所说的,看起来您的 JavaList是 properly converted to a Scala collection 并且您正确调用了它的add方法,但是您正在使用的java.util.List的实现不支持 @987654335 @(根据Javadoc是可选操作)。 -
@Ben
entity.getConfigList.getClass返回scala.collection.convert.Wrappers$SeqWrapper。也许问题是我使用 scala 转换,因为其他地方的相同代码可以正常工作。 -
@Everv0id 这应该不是问题——在 Scala 中使用 Java 集合的常用方法是隐式包装它们。 Java 中使用什么具体类来实现
SomeEntity中的List接口? -
如果您使用
import collection.JavaConversions._,您可以将List隐式转换为MutableBuffer,使您能够执行entity.getSomeOtherEntities.append(otherEntity)- 但我怀疑您仍然会得到UnsupportedOperationException。跨度>