我有一个引用两个子对象的对象,我将它返回到视图,就像我对其他任何变量一样。
public class Object1 extends ArrayList<Object2> {
private List<Object2> obj2 = new ArrayList<Object2>;
private Object3 obj3;
public List<Object2> getObject2() {
return this.obj2;
}
public Object3 getObject3() {
return this.obj3;
}
@Override
public boolean add(Object2 o2) {
//some other code goes here
return super.add(o2);
}
}
public class Object2 {
int applianceId;
String status;
}
public class Object3 {
int member3;
String member4;
}
在我的模板中将Object1分配给变量obj1。问题是如果我打电话给getObject2()
,我什么也得不到,虽然我可以正常访问getObject3()
。真正奇怪的是,如果我在没有getter的情况下访问obj1,它将包含getObject2()
应该返回的所有内容。
所以,我希望这会起作用,但事实并非如此:
@for(a <-obj1.getObject2()){
@a.member1
@a.member2
}
它什么都不返回。
但是,这确实会从对象2返回数据:
@for(a <-obj1){
@a.applianceId
@a.status
}
结果为:3046 GREEN 3066 GREEN 3086 GREEN 3126 RED 3166 RED 3026 RED 3146 RED
任何人都可以解释为什么会发生这种情况以及如何纠正它?
答案 0 :(得分:0)
您永远不会向obj2
添加任何内容。
当您移除extends ArrayList<Object2>
然后使用add()
方法时,您必须将super.add(o2)
更改为obj2.add(o2)
,然后将添加到 obj2
实例,因此您可以获得您所看到的数据。
我认为您不需要以下代码,因为它让您感到困惑:
private List<Object2> obj2 = new ArrayList<Object2>;
public List<Object2> getObject2() {
return obj2;
}
当您致电Object1.add(Object2)
时,它只会被添加到Object1的实例中,并存储在超级类List
中而不是obj2
实例中。
因此,在模板中(或其他任何地方)调用obj1.getObject2()
将始终返回空ArrayList<Object2>
。
通过这样做,您可以获得添加的数据:
for(Object2 obj: obj1) {
// do something with the data
}
或
@for(a <-obj1){
@a.applianceId
@a.status
}
这样做有什么问题?
或删除extends ArrayList<Object2>
并使用您编写的方法访问数据。
基本上,您必须注意将数据存储在预期的位置。如果您正在使用Eclipse(或其他IDE),我强烈建议您调试它并在添加/访问数据的方法中设置断点并查看列表包含的内容,它们具有方便的视图,可以让您查看所有字段和范围内的对象。
答案 1 :(得分:0)
我给出的例子没有显示我如何填充对象,但我向你保证它们已被填充。
问题似乎源于Object1扩展ArrayList的事实。我所做的只是重写add()方法,所以我可以插入一些额外的功能。删除&#34;扩展ArrayList&#34;解决了这个问题,虽然我不明白为什么扩展ArrayList类造成了这个问题。也许是Play Framework中的怪癖?