我Morphia
在scala中使用时发现了这个问题。它通过反射检查类的字段,并获取映射所需的类型信息。
但是如果我使用traits
, 并定义一些集合字段,泛型类型信息会丢失,导致 Morphia 无法获取足够的信息,并抛出异常。
查看我的代码:
trait HasTags {
@Reference
var tags: java.util.List[Tag] = new java.util.ArrayList[Tag]() // the generic type is Tag
}
class Question extends Entity with HasTags {
}
我编译了 scala 文件,并获得了一些 java 类文件。然后我使用java反编译器查看java字节码的内容:
public class Question extends Entity implements HasTags {
@Reference
private java.util.List tags;
}
你可以看到这里没有Tag
,所以 Morphia 会失败。
我用过scala 2.8.1
。有什么办法可以解决吗?
更新
@extempore 说,可能javap
不会显示该Tag
信息。
但是我用了一个叫Java Decompiler的程序,不行javap
。
我试过这段代码:
class Question extends Entity with HasTags {
@Reference
var tags2: java.util.List[Tag] = new java.util.ArrayList()
}
并查看 中的字节码Java Decompiler
,它显示:
public class Question extends Entity implements HasTags {
@Reference
private java.util.List tags;
@Reference
private java.util.List<models.Tag> tags2;
}
我们可以看到tags2
contains Tag
,但tags
没有。
界面HasTags
是:
public abstract interface HasTags extends ScalaObject
{
public abstract List<Tag> tags();
@TraitSetter
public abstract void tags_$eq(List<Tag> paramList);
}
我们可以看到,方法的返回值tags()
是List<Tag>
,但字段tags
不是。
由于morphia是通过字段获取信息的,所以不能正常工作。