我一直在玩擺脫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