java - Groovy 静态泛型类型

标签 java generics activerecord groovy

我一直在尝试摆脱 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/

相关文章:

asp.net-mvc - EntityFramework 的 Activerecord 回调和 NamedScope 版本

php - 在 codeigniter 中调用数据库日期函数

java - 如何使父类(super class)中的某些方法在子类中不可用

java - 自动(半)创建单元测试?

java - 具有透明内容的 SwingNode

java - google guice 内部是如何工作的

java - 整数类型未按预期工作(Java)

c# - 通过反射表示类型 Func<dynamic, object>

c# - Moq 模拟泛型和表达式函数

ruby-on-rails - Activerecord - 保存所有关联对象后的回调