我想写一个快速但肮脏的帮助类,它可以快速保存我的对象。因此,我正在使用 OrmLite。
我不想在我的类上添加注释,所以我尝试在没有任何字节码库的情况下即时添加包装器。
<T> void save(T o) {
@DatabaseTable
class wrap extends T {
@DatabaseField(generatedId = true)
public Long id;
}
try {
Dao<T, Long> d = (Dao<T, Long>) getClassDao(o.getClass());
TableUtils.createTableIfNotExists(connectionSource, o.getClass());
d.createOrUpdate(o);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
问题是 class wrap extends T
- 为什么不能扩展 T
?
最佳答案
这是一个奇怪但有趣的问题!给出一个准确而详尽的答案是很棘手的。可能有很多不同的原因,但我认为以下原因是最重要的:
编译器只会生成一个版本的save
。对于 class wrap extends T
来处理参数 T
每次使用不同类型的 save
都必须是不同的具体类,但这不是泛型的工作方式。 save
只编译一次,save
里面的T
是类型参数,不是具体类型。 (这与类型删除有些相关,但又有所不同,请参见下文。)
另一个原因是type erasure . Java 中的泛型类型只存在于编译时。另一方面,Java 中的类具有运行时表示(与 C++ 等不同)。因此,不可能从泛型类型的仅编译时构造生成类的运行时表示。
关于java - 扩展类型参数的内联类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39163984/