java - 扩展类型参数的内联类

标签 java generics ormlite

我想写一个快速但肮脏的帮助类,它可以快速保存我的对象。因此,我正在使用 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/

相关文章:

Java 8 并行流或方法执行

android - 使用 OrmLite 在 Sqlite 中组合删除语句的帮助不大

java - 使用 Gson 将 Json 响应解析为 java 对象

java - 为什么在使用有界类型参数时需要强制转换

android - OrmLite Android DatabaseHelper 使用

java - jsp中迭代ArrayList时出现NullPointerException

java - Class.get方法可以找到包含Class<类型的方法吗? > 参数?

java - == 带字符串的运算符

java - 无法获取通用 ResponseEntity<T>,其中 T 是通用类 "SomeClass<SomeGenericType>"

Swift:equatable 字典不能传递给泛型函数