在编译时获取泛型类

2023-12-13

虽然我知道由于类型擦除,您实际上无法在运行时获取泛型的类型,但我想知道是否可以在编译时获取它。

class ObjectHandle<T extends ObjType> {
    T obj;
    void setObj(T o) {
        obj = o;
    }
}

class ObjType {}
class SubObjType extends ObjType {}

...
ObjectHandle<SubObjType> handle = new ObjectHandle<SubObjType>();
...
ObjType obj = [method that returns an ObjType];
if(obj instanceof [handle's generic class, here SubObjType]) {
    handle.setObj(obj); // cast???
}

这里编译器知道泛型的类型handle我想要的是这样我就不必改变类型handleinstanceof当我决定更改类时(在代码中,当然不是在运行时)检查(和强制转换)。


由于泛型类型会被删除,因此您需要在代码中的某个位置指定 java.lang.Class。一种方法是将其传递给通用方法:

ObjType obj = /*...*/;
handleObj(obj, SubObjType.class);

// ...

private <T extends ObjType> void handleObj(ObjType obj,
                                           ObjectHandle<T> handle,
                                           Class<T> handleableObjClass) {
    if (handleableObjClass.isInstance(obj)) {
        handle.setObj(handleableObjClass.cast(obj));
    }
}

如果您不知道要查找的 ObjType 的子类,则需要向 ObjectHandle 添加可具体化的 Class 属性,类似于 java.util.EnumSet 和 java.util.EnumMap 的做法:

class ObjectHandle<T extends ObjType> {

    T obj;

    private final Class<T> objectClass;

    ObjectHandle(Class<T> cls) {
        objectClass = Objects.requireNonNull(cls);
    }

    Class<T> getObjectClass() {
        return objectClass;
    }

    void setObj(T o) {
        obj = o;
    }
}

// ...
ObjectHandle<SubObjType> handle = new ObjectHandle<SubObjType>();
// ...

ObjectType obj = /*...*/;
if (handle.getObjectClass().isInstance(obj)) {
    handle.setObj(handle.getObjectClass().cast(obj));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在编译时获取泛型类 的相关文章

随机推荐

  • 间歇性 MySQL 服务器已消失错误

    我一直在绞尽脑汁试图找出导致脚本间歇性错误的原因 错误是 SQLSTATE HY000 一般错误 2006 MySQL 服务器已经消失 下面的脚本是一个函数的一部分 该函数执行curl 从 JSON 响应中获取一些值 然后将它们写入表中 我
  • PDO错误处理[重复]

    这个问题在这里已经有答案了 从有关管间的教程中 我了解了一些有关执行 PDO 查询的知识 本教程使用了 try catch 查询的结构基本上如下 try dbh new PDO mysql host hostname dbname dbna
  • 捕获正在运行的进程的 FlashWindowEx 事件

    我有一个已经在运行的应用程序 它时不时地触发 FlashWindowEx 事件 Windows 7 图标闪烁 我想捕捉这个事件 但我似乎找不到任何关于如何捕捉的好信息 我的想法是事情会是这样的 使用 Process GetProcesses
  • Ajax 日历扩展器结束日期

    我正在使用 ajax 日历扩展器作为 起始日期 和 截止日期 文本框 我必须禁用 截止日期 之前的日期或小于所选 起始日期 的日期 我可以看到很多帖子使用range validation 如何在不向用户发送任何消息的情况下禁用日期 首先添加
  • Silverlight 中的 Lync 错误:客户端不受信任

    当我尝试在 Silverlight 应用程序中加载 Lync 控件时 出现错误 客户端不受信任 当我在没有相应的 Web 项目的情况下调试 Silverlight 应用程序时 不会出现此错误 这是生成错误的代码 LyncClient l L
  • 为什么 python 不能从 python 函数中调用 Javascript() ?

    我使用了建议的代码从 iPython Notebook 下载 CSV动态构建 JavaScript 代码 并在从 Jupyter Notebook 调用时使用 Python 中的 Javascript 将其传递到浏览器 代码效果很好 如果我
  • 丢失了我的密钥库,只有 SHA1

    我不小心删除了我的keystore文件 现在我无法在 Google Play 中更新我的应用程序 我只有其中的 SHA1 指纹 我想知道是否有办法创建一个新的密钥库并在那里插入该 SHA1 代码 这样我就可以使用密钥库再次管理我的应用程序
  • 如何根据张量流中的某些谓词从队列中过滤张量?

    如何使用谓词函数过滤存储在队列中的数据 例如 假设我们有一个存储特征和标签张量的队列 我们 只需要那些满足谓词的张量 我尝试了以下实现但没有成功 feature label queue dequeue if predicate featur
  • C++ 传递函数指针

    我有以下功能 static void p 我想将指向 p 的函数指针传递给函数 x void x void ptr 我正在尝试以下操作 但它不起作用 x ptr 注意 x 和 p 属于不同的类 我收到以下编译错误 invalid conve
  • 如果一个字段已填满,是否可以禁用另一个字段的输入?

    如果另一个字段包含 MS Dynamics AX 2012 中的数据 我想禁用表字段的输入 更新1 如果 Field1 有输入 Field2 和 Field3 必须为空 字段1 字段2 字段3 客户编号 身份证号 1 0000000001
  • Flutter - Android 在发布模式下不请求许可 - 自动拒绝

    在一周内我不再问这个问题之后 我就来了 我一直在尝试解决Android没有权限的问题 我用 Flutter 开发了这个应用程序 并将其上传到 Play 商店进行开放测试 但是 在发布模式下 它永远不会请求许可 只是从来没有 控制台 logc
  • log4j2:注册自定义触发策略

    我为 log4j2 编写了一个自定义 TriggeringPolicy 它应该按照以下建议在每个小时 天 your interval 结束时滚动 log 文件这个帖子 尽管我遵循 TimeBasedTriggeringPolicy 约定 命
  • “vaGetDisplay”和“vaGetDisplayDRM”的错误[重复]

    这个问题在这里已经有答案了 将 ubuntu 操作系统从 14 04 更新到 16 04 后 我使用以下配置安装了 ffmpeg 库 PATH HOME bin PATH PKG CONFIG PATH HOME ffmpeg build
  • Delphi如何旋转png图像?

    如何在 Delphi 中旋转 png 图像并保持其透明度 我通过加载它TPNGObject 然后我正在使用Canvas StretchDraw MyRect the TPNGObject 但我不知道如何旋转它 问题是 如果您使用画布进行旋转
  • 使用自定义类根据其他数组对 NSArray 进行排序

    我迫切需要对数组进行排序 情况如下 我需要根据另一个数组中的其他对象类重新排列 排序和替换数组 ParentClass NSObject NSString name NSNumber type 这是父类 填充parentArray pare
  • 如何在asp.net中打开MS Office word?

    在我的应用程序中 当用户单击特定链接按钮时 MS Word 必须打开 我如何为此编写代码 谢谢 无法保证当用户单击网页上的链接 按钮时将打开特定应用程序 打开的应用程序由用户的浏览器和操作系统设置决定 作为开发人员 您可以指定MIME类型您
  • 如何针对 Google Api 撤销身份验证令牌客户端

    我正在尝试使用 Google Api 客户端代码撤销令牌 我的代码看起来像这样 get https accounts google com o oauth2 revoke token accessToken function window
  • 单击 jQuery 中的链接时如何防止模糊()运行?

    i have
  • 将一个表中的值插入到另一表中

    我有这段代码来选择 jobseeker 表中的所有字段 并且应该通过将 userType 设置为 admin 来更新 user 表 其中 userID userID 此 userID 是我的用户中的一个用户 数据库 然后 该语句应该将 jo
  • 在编译时获取泛型类

    虽然我知道由于类型擦除 您实际上无法在运行时获取泛型的类型 但我想知道是否可以在编译时获取它 class ObjectHandle