我在java中定义了以下继承层次结构。
public class BaseModel extends HashMap<String, Object> {
public String getString(String key) {
return (String)this.getOrDefault(key, "EMPTY");
}
}
public class Entity extends BaseModel {
private String id;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
现在在一个groovy脚本中,我尝试执行以下操作:
Entity entity = new Entity();
entity.id = "101";
entity.name = "Apple"
和“id”和“name”无法识别。有趣的是,如果我执行以下操作之一,它们就会被识别出来:
起初我认为groovy因为扩展HashMap而无法识别“id”和“name”语法,但上面的#3证明这是不正确的。我很难过为什么在这一点上没有被认出来。有人可以帮我吗?复制粘贴应该很容易,并自己尝试一下。
答案 0 :(得分:0)
问题似乎是实体类中的setter和getter,groovy中的所有内容都是公共的,它会创建所有getter和setter方法。
我测试了groovy控制台中的下一个代码并且它有效。
public class BaseModel extends HashMap<String, Object> {
public String getString(String key) {
return (String)this.getOrDefault(key, "EMPTY");
}
}
public class Entity extends BaseModel {
private String id;
private String name;
}
Entity entity = new Entity();
entity.id = "101";
entity.name = "Apple"
println entity.id
它在groovyConsole输出屏幕中打印101。
答案 1 :(得分:0)
当Entity从BaseModel或直接从HashMap扩展时,Entity将成为Map。所以,当我们说entity.id时,Groovy试图在地图中找到一个键为'id'的条目。由于没有这样的条目,它打印出null。
public class Entity extends HashMap<String, String> {
private String id;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
Entity entity = new Entity();
entity.id = "101";
entity.name = "Apple"
println entity.id //prints null
但是当Entity不再从BaseModel扩展时,entity.id将被解释为Entity的成员。
public class Entity {
private String id;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
Entity entity = new Entity();
entity.id = "101";
entity.name = "Apple"
println entity.id //prints 101