我一直在尝试摆脱 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”的消息。
最佳答案
Groovy 不是静态类型的。我想你会发现它在编译时删除了 T,甚至懒得去弄清楚它不在范围内;这与 Groovy 无关。
关于java - Groovy 静态泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3897245/