静态成员中的通用参数声明

2023-12-24

为什么不允许定义这样的静态成员:

private static final <T extends Object> Map<Class<T>, BiFunction<T, T, Boolean>> SPECIFIC_HANDLERS = new HashMap<>();

相反,只允许在未指定的情况下使用它:

private static final Map<Class<?>, BiFunction<?, ?, Boolean>> SPECIFIC_HANDLERS = new HashMap<>();

是否有解决方法,以便我可以定义 BiFunction 的两个参数必须具有相同类型,并且 Map 的键必须是这些参数的类类型?

更新以澄清(因为@Mena的建议不适合我):

我想要一个用于通用 equals 帮助器的数组 equals 方法的映射。通用助手正式接收两个对象。如果它们是数组,我必须将其传递给重载的 Arrays.equals() 方法之一。我想查找正确的方法(示例 1):

private static final Map<Class<?>, BiFunction<?, ?, Boolean>> ARRAY_EQUALS_HANDLER = new HashMap<>();

static
{
    ARRAY_EQUALS_HANDLER.put( Object[].class,  (l, r) -> Arrays.equals( (Object[])  l, (Object[])  r ));
    ARRAY_EQUALS_HANDLER.put( boolean[].class, (l, r) -> Arrays.equals( (boolean[]) l, (boolean[]) r ));
    ....
}

然后像这样使用它:

boolean equal = ARRAY_EQUALS_HANDLER.get( anObj1.getClass()).apply(anObj1, anObj2);

该构造(根据 Mena 的说法)甚至无法编译:

private static <T extends Object> Map<Class<T>, BiFunction<T, T, Boolean>> getSpecificHandlers() 
{
    Map<Class<T>, BiFunction<T, T, Boolean>> result = new HashMap<>();
    result.put( Object[].class,  (l, r) -> Arrays.equals( (Object[])  l, (Object[])  r ));
    result.put( boolean[].class, (l, r) -> Arrays.equals( (boolean[]) l, (boolean[]) r ));
    return result;
}

如果我在方法外部填充生成的地图:

 @SuppressWarnings( { "unchecked", "rawtypes" })
private static final Map<Class<?>, BiFunction<?, ?, Boolean>> ARRAY_EQUALS_HANDLER = (Map) getSpecificHandlers();

static
{
    ARRAY_EQUALS_HANDLER.put( Object[].class,  (l, r) -> Arrays.equals( (Object[])  l, (Object[])  r ));
    ...
}

那么整个类型安全性就消失了,因为在将其分配给最终静态成员时我必须进行(未经检查的)类型转换。

我上面的示例 1 有效,但是在使用它时我必须转换收到的 lambda:

private static <T extends Object> boolean equalsArray( T anArray, T anOtherArray) {
    Object o = ARRAY_EQUALS_HANDLER.get( anArray.getClass());
    @SuppressWarnings( "unchecked")
    BiFunction<T, T, Boolean> func = (BiFunction<T, T, Boolean>) o;

    Boolean result = func.apply( anArray, anOtherArray);
    return result;
}

您正在使用泛型方法习惯用法(返回类型之前的类型参数声明)作为常量声明。

该习惯用法无法编译。

正如其他地方提到的,您不能在静态上下文中使用类泛型类型。

你什么can解决方法是声明一个静态方法而不是常量 - 如下所示:

private static final <T extends WhateverBound> Map<Class<T>, 
    BiFunction<T, T, Boolean>> 
    getSpecificHandlers(T t) {

    // return new HashMap<Class<T>, BiFunction<T, T, Boolean>>();
    // much easier on the eye - thanks Andy Turner
    return new HashMap<>();
}

假设:

static class WhateverBound{}
static class Foo extends WhateverBound {}

然后您可以调用您的方法:

Map<Class<Foo>, BiFunction<Foo, Foo, Boolean>> map = 
getSpecificHandlers(new Foo());

当然请注意,final此处的关键字具有非常不同的含义,并且可能可以完全省略。

Or...

您可以将其保留为常量,并在所有类型参数化中重复通配符/边界模式。

例如:

private static final Map<Class<? extends WhateverBound>, 
     BiFunction<? extends WhateverBound, ? extends WhateverBound, Boolean>> 
       SPECIFIC_HANDLERS = new HashMap<>();

static {
    SPECIFIC_HANDLERS.put(Foo.class, (f, ff) -> true);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态成员中的通用参数声明 的相关文章

  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • ExceptionConverter:java.io.IOException:文档没有页面。我正在使用 iText

    当我执行下面的代码时 File f new File c sample pdf PdfWriter getInstance document new FileOutputStream f document open System out p
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • IntelliJ IDEA 创建的 JAR 文件无法运行

    我在 IntelliJ 中编写了一个跨越几个类的程序 当我在 IDE 中测试它时它运行良好 但是 每当我按照教程将项目制作成 jar 可执行文件时 它就不会运行 双击 out 文件夹中的文件时 该文件不会运行 并显示 无法启动 Java J
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • Clip 在 Java 中播放 WAV 文件时出现严重延迟

    我编写了一段代码来读取 WAV 文件 大小约为 80 mb 并播放该文件 问题是声音播放效果很差 极度滞后 你能告诉我有什么问题吗 这是我的代码 我称之为doPlayJframe 构造函数内的函数 private void doPlay f
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 当单元格内的 JComboBox 中有 ItemEvent 时,如何获取 CellRow

    我有一个 JTable 其中有一列包含 JComboBox 我有一个附加到 JComboBox 的 ItemListener 它会根据任何更改进行操作 但是 ItemListener 没有获取更改的 ComboBox 所在行的方法 当组合框
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个

随机推荐

  • 元数据中的启动脚本未运行(Python、Google Compute Engine、云存储触发器)

    我有一个在 Google App Engine 上运行的应用程序 以及一个在 Google Compute Engine 上运行的 AI 我触发 VM 实例在 Google Cloud Storage 存储桶中发生更改时启动 并尝试将启动脚
  • Rscript 问题 - 使用不同版本的 R?

    我正在尝试在 Rscript 中加载库 但它给了我一个奇怪的错误 我正在运行 2 12 1 版本的 Rscript 二进制文件 但它抱怨我的包是在版本 2 12 1 下构建的 知道这是怎么回事吗 17 55 13 trash tmp R L
  • 为生产调整 Rails 性能?

    我即将部署一个基于 Rails 3 1 x 构建的应用程序 并开始运行一些性能测试 摆弄之后ab有一段时间 我在 Heroku 上看到了一些非常令人沮丧的结果 每秒产生大约 15 个请求 在本地测试时 我看到类似的结果 这确实表明这是一个应
  • org.hibernate.ObjectNotFoundException:不存在具有给定标识符的行:单表查询

    我正在使用 hibernate 进行一个简单的查询 没有连接 我想做的就是从表中检索最大 id 这项服务几个月来一直运行良好 但突然在过去两周内 我收到了可怕的 No row with the给定标识符存在错误 即使这个表包含数百万行 怎么
  • 如何使用 defaultdict 行为扩展 OrderedDict

    我有一个清单OrderedDict对象 我想将它们全部组合在一起 然后按每个中的水果属性对它们进行排序 我一直在尝试使用组合和排序它们defaultdict使用下面的代码 super dict apple defaultdict list
  • 如何在django中操作用户上传的文件而不保存它?

    我正在制作一个应用程序 它从 csv 文件获取数据并使用它生成图表 所有文件都包含相同的结构 由于服务器价格的原因 我决定不存储这些文件 我现在将使用 heroku 来托管这个应用程序 这是一个 Django 应用程序 我想知道如何才能使用
  • 如何切换到新的远程git存储库

    我最近将一个存储库克隆到本地驱动器 但现在我尝试将所有更改推送到一个完整的新存储库 然而 git 不断告诉我权限被拒绝 这是因为它正在尝试推送到最初克隆的存储库 DETAILS 我最初克隆自https github com taylonr
  • XSLT:如何查找节点的唯一子节点的数量?

    我的 XML 看起来像这样
  • 从 P7M 获取签名内容

    我正在使用 java jdk 1 7 和 bouncycastle 库来获取 p7m 签名文件的内容 在构建路径中 我添加了以下文件 bcpkix jdk15on 160 jar commons io 2 1 jar log4j 1 2 1
  • 服务器端控件的输入类型

    我正在使用 asp net 构建 ipad web 应用程序 我知道使用input type email 将导致 iPad 上的键盘布局发生更改 以便比默认设置更轻松地处理电子邮件输入 问题是我正在使用服务器端文本框控件 有谁知道如何让服务
  • 如何锁定滑块并防止用鼠标将值更新到 dat.GUI 菜单中

    我尝试实现一种方法来防止用鼠标更新值 实际上当three js动画已开始 通过单击按钮启动 目前 我有以下内容dat GUI menu 单击 开始 按钮后 我想阻止用户用鼠标修改参数 Rotation x and Rotation y 这是
  • 列表作为字典中不可 JSON 序列化的条目

    我需要将列表 或 numpy 数组 保存为 JSON 文件中的条目之一 我收到 不可 JSON 序列化 错误 并且我不知道如何修复它 以及为什么当我手动将列表传递到字典时我没有收到它 My code def get col stats co
  • 使用 AlaSQL 和 JQuery 加载 CSV 文件

    我正在构建一个基于 HTML 的应用程序 用于使用 AlaSQL 查询导入的 CSV 文件 我开始于这个演示 http alasql org demo 008file 并尝试通过设置来实现相同的行为onChange事件通过 JQuery 而
  • 给定多个节点,求 AVL 树的最小和最大高度?

    给定一定数量的节点 是否有公式可以计算 AVL 树的最大和最小高度 例如 课本问题 3 个节点 5 个节点和 7 个节点的 AVL 树的最大 最小高度是多少 课本答案 3 个节点的 AVL 树的最大 最小高度为 2 2 5 个节点的 AVL
  • 如何在 IntelliJ 中配置 dagger

    我下载了 dagger 因为它似乎是 Android 中依赖注入的一个不错的选择 但我在集成编译器时遇到了一些麻烦 有关于正确设置的任何提示吗 我遵循了有关 android 注释的说明 因为这个项目似乎很相似 但这对匕首不起作用 我做了什么
  • 在 p:dataTable 上执行搜索后,p:dataTable 中的 p:fileDownload 不起作用(仅刷新页面)

    我有一个 JSF PrimeFaces Web 应用程序 在一页中
  • Eclipse 中的“与编辑器链接”功能有什么作用?

    我是 Eclipse 新手 也不了解 NetBeans 我正在阅读 eclipse 教程 但我很困惑 无法理解 与编辑器链接 到底是做什么的 Eclipse gt 帮助中说 选择本地工具栏或其中之一的视图菜单中的 与编辑器链接 按钮 导航视
  • 套接字传递十六进制值

    我正在尝试将套接字中的字符串值传递到另一台服务器 另一个服务器应该接收十六进制格式的值 即 如果我的字符串在服务器上是 s 600185838e 它应该收到 60 01 85 83 8e 但是我发送的这些值已转换为 ASCII 并且不是所需
  • 将文本输入放在单选按钮的标签内?

    我正在尝试创建一个指定一堆选项的单选组 以及一个带有要指定的文本输入的额外选项 其他 我正在使用的这个特定单选按钮的代码是
  • 静态成员中的通用参数声明

    为什么不允许定义这样的静态成员 private static final