我一直在玩摆脱DAO赞成ActiveRecord像Java中的实体,但泛型不会让我有我想要的全部功能(如静态发现者)。不知何故,Groovy确实如此,但我很困惑。鉴于以下几点:Groovy静态泛型类型
class ActiveRecord<T> {
static Class<T> genericType;
ActiveRecord() {
genericType = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
static T find(Serializable id) { return EntityManagerHolder.find(genericType, id); }
void save() { EntityManagerHolder.persist(this); }
}
@Entity @Table(name="TEST")
class FakeTable extends ActiveRecord<FakeTable> {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
Long id;
String status;
String type;
static void main(args) {
FakeTable t = new FakeTable();
t.status = "TESTING";
t.save();
println FakeTable.find(t.id);
}
}
此代码(与同时排除了JPA的东西),但我不知道为什么我能申报
static Class<T> genericType;
该编译器做一些魔术前实际的Java类是否被编译?也许groovy编译器将T替换为生成的Java类中的实际类名称?
在严格的Java中,我可以从查找方法返回类型和类声明中访问泛型类型,但两者都被擦除为Object。这是有道理的,而Groovy也是这样,但在Java中,上面的行错误带有类似'不能引用非静态T'的消息。
很高兴知道!我没有做太多的groovy开发。看起来我需要多读一点。 – hisdrewness 2010-10-14 06:28:53