【问题标题】:Strange behavior using java list in scala class在scala类中使用java列表的奇怪行为
【发布时间】: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&lt;SomeOtherEntity&gt; someOtherEntities;改成private ArrayList&lt;SomeOtherEntity&gt; someOtherEntities;
  • 这看起来像是您的 Java 代码而不是 Scala 代码中的问题。您是否成功地从 Java 调用 SomeEntity#getSomeOtherEntities.add?根据您所说的,看起来您的 Java Listproperly 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。跨度>

标签: java scala


【解决方案1】:

最后我解决了这个问题。问题是我在某个地方使用了scala.collection.JavaConverters 并在Scala List 上做了.asJava。我的应用程序不需要特别快,所以我设法通过用这个替换 SomeEntity.someOtherEntities 字段的 setter 来解决它:

public void setSomeOtherEntities(List<SomeOtherEntity> someOtherEntities) {
    this.someOtherEntities = new ArrayList<>();
    this.someOtherEntities.addAll(someOtherEntities);
}

【讨论】: