我正在从导入的库中扩展一个非常简单的Java接口。界面非常简单,它声明的唯一方法是属性列表的getter和setter。
我的应用程序是用Groovy编写的,所以我想用Groovy类实现这个Java接口。
我的印象是Groovy默认为其任何类的属性创建了getter和setter - 我可以使用这些默认的getter和setter来满足Java接口的要求吗?
Library的Java接口:
public interface Animal { // java interface
public String getName();
public void setName(String name);
public Integer getAge();
public void setAge(Integer age);
}
我希望我能用Groovy实现它(但我的编译器抱怨缺少setter):
public class Cat implements Animal { // Groovy class
public String name;
public Integer age;
}
答案 0 :(得分:6)
你可以使用groovy 属性来做到这一点,但要考虑 fields and properties 之间的区别:
字段是类或特征的成员:
- 强制访问修饰符(公共,受保护或私有)
- 一个或多个可选修饰符(静态,最终,同步)
- 可选类型
- 强制名称
[...]
属性是私有字段和getter / setter的组合。 您可以使用以下命令定义属性:
- 缺席访问修饰符(无公开,受保护或最终)
- 一个或多个可选修饰符(静态,最终,同步)
- 可选类型
- 强制名称
Groovy将适当地生成getter / setter。
当您放置显式访问修饰符时,实际上是在使用字段,因此不会生成getter / setter,这就是编译器抱怨Can't have an abstract method in a non-abstract class
的原因,因为getter / setter不存在。