【发布时间】:2010-10-09 18:07:05
【问题描述】:
我一直在尝试摆脱 DAO,转而使用 Java 中的 ActiveRecord 类实体,但泛型不允许我拥有我想要的全部功能(如静态查找器)。 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 中,我可以从 find 方法返回类型和类声明中访问泛型类型,但两者都被擦除为 Object。这是有道理的,Groovy 也是如此,但在 Java 中,上面的代码行错误并显示类似于“无法引用非静态 T”的消息。
【问题讨论】:
标签: java generics activerecord groovy