使 Java 类通用,但仅适用于两种或三种类型

2023-11-23

(我很惊讶在 stackoverflow 上找不到这个问题,我只能将其归咎于我的谷歌搜索不佳,无论如何都要指出重复的问题......)

这是一个玩具类,它返回与您放入其中的内容相反的内容。目前它适用于整数,但只需要非常小的更改即可适用于字符串。

public class Mirror {

  int value;

  public int get() {
    return reverse(value);
  }

  private int reverse(int value2) {
    String valueString = value + "";
    String newString = reverse(valueString);
    return Integer.parseInt(newString);
  }

  private String reverse(String valueString) {
    String newString = "";
    for (char c : valueString.toCharArray()) {
      newString = c + newString;
    }
    return newString;
  }

  public void set(int value) {
    this.value = value;
  }

}

我想做的是使类通用,但仅适用于两种或三种可能的类型。所以我想写的是:

public class Mirror<X, where X is one of Integer, String, or MagicValue {

X value

public X get(){
[...]

正确的语法是什么?我的 Google-fu 让我失望了......:(

编辑:它出现在那里isn't正确的语法,但似乎无法完成,所以我的主要问题是:为什么?这似乎是人们在上课之前可能想做的事情truly通用的...

编辑编辑:今天设法与一些实验室伙伴一起找出原因,因此在下面添加了相关的原因答案。


不幸的是java并没有直接提供这样的功能。不过,我可以建议您采取以下解决方法:

创建参数化类Mirror具有私有构造函数和 3 个创建实例的静态工厂方法Mirror具有特定参数:

public class Mirror<T> {
    private T value
    private Mirror(T value) {
        this.value = value;
    }

    public static Mirror<Integer> integerMirror(Integer value) {
        return new Mirror(value);
    } 

    public static Mirror<String> stringMirror(String value) {
        return new Mirror(value);
    } 

    public static Mirror<MagicValue> magicMirror(MagicValue value) {
        return new Mirror(value);
    } 
}

EDIT显然你可以(并且可能应该)将班级分开Mirror从它的创建开始,例如将工厂方法放在单独的类中MirrorFactory。在这种情况下,构造函数应该受到包保护。

如果您想支持大量但数量有限的类,您可以只实现一种通用工厂方法

    public static <T> Mirror<T> createMirror(T value) {
        checkTypeSupported(value);
        return new Mirror(value);
    } 

Method checkTypeSupported(value);可以使用某种元数据(例如属性、JSON 等文件)来获取支持的类型。然而在这种情况下,您将无法享受编译时验证。

其他解决方案是要求所有受支持的类型扩展某些基类或实现接口:

public class Mirror<T extends MyInterface> {}

但这个解决方案似乎不符合您的要求,因为您需要Integer, String and MagicValue.

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

使 Java 类通用,但仅适用于两种或三种类型 的相关文章

  • 如何将 Java 赋值表达式转换为 Kotlin

    java中的一些东西就像 int a 1 b 2 c 1 if a b c System out print true 现在它应该转换为 kotlin 就像 var a Int 1 var b Int 2 var c Int 1 if a
  • 如何在 JFace 的 TableViewer 中创建复选框?

    我创建了一个包含两列的 tableViewer 我想将其中一列设为复选框 为此 我创建了一个 CheckBoxCellEditor 但我不知道为什么它不起作用 名为 tableName 的列显示其值正常 色谱柱规格如下 String COL
  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • 如何为 Gson 编写自定义 JSON 反序列化器?

    我有一个 Java 类 用户 public class User int id String name Timestamp updateDate 我收到一个包含来自 Web 服务的用户对象的 JSON 列表 id 1 name Jonas
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • javax.persistence.Table.indexes()[Ljavax/persistence/Index 中的 NoSuchMethodError

    我有一个 Play Framework 应用程序 并且我was使用 Hibernate 4 2 5 Final 通过 Maven 依赖项管理器检索 我决定升级到 Hibernate 4 3 0 Final 成功重新编译我的应用程序并运行它

随机推荐

  • Swing:如何制作具有软边框的非矩形窗口?

    如何在 Java 中制作具有软边框的非矩形窗口 软边框 也称为软剪裁 是没有锯齿伪影的边框 我在网上搜索了很多 发现了几篇关于半透明和 或 非矩形窗户 软边界 这个话题很令人困惑 看来我找到的信息有优惠 将软边框应用于组件inside另一个
  • 有时 Facebook 共享对话框无法在 iOS 上加载

    有时 当我启动 Facebook 共享对话框时 操作系统会切换到 Facebook 应用程序 但共享对话框不会加载 然后如果你再试一次 通常会成功 为什么第一次不起作用 NSURL url NSURL URLWithString some
  • 如何在 Perl 中有效地解析 CSV 文件?

    我正在开展一个项目 涉及在 Perl 中解析大型 csv 格式的文件 并且希望提高工作效率 我的方法是split 首先按行读取文件 然后split 每行再次用逗号来获取字段 但这并不是最理想的 因为至少需要两次传递数据 一次按行分割 然后再
  • 相同数据的多个查找结构:内存重复?

    假设我有一群人的数据 并且我希望能够以不同的方式查找他们 也许有某种数据结构 如二叉树 可以方便按名称查找 也许还有另一个 如列表 是按创建顺序排列的 也许还有更多 在许多语言中 每个人都会在堆上分配一次 每个数据结构都包含指向该内存的指针
  • Rails 应用程序有批量电子邮件插件吗?

    有谁知道有一个插件或可以用来为 Rails 应用程序发送批量电子邮件的东西吗 具体来说 我希望能够将 HTML 电子邮件文件传递给 rake 任务或其他任务 并将其通过电子邮件发送给所有注册到我的网站并选中 请向我发送有关 XXX 的信息
  • 确定是否通过 FCM 通知单击打开了活动

    我正在使用 fcm 控制台向所有安装了我的应用程序的设备发送消息 通知没有任何额外的有效负载 只有通知消息 我想知道是否有一种简单的方法可以知道是否通过 FCM 通知单击打开了活动 有一个解决方案 通过扩展FirebaseMessaging
  • 模拟索引属性

    我正在使用 Moq 编写单元测试 我创建了一个模拟对象 现在 当我尝试模拟其属性时 我收到错误 表达式树可能不包含索引属性 这是我的代码 public Node GetNode IMyInterface interface string i
  • Pycharm:设置运行manage.py任务的环境变量

    我已经移动了我的SECRET KEY我的设置文件中的值 当我加载 virtualenv 时它会被设置 我可以确认该值存在于python manage py shell 当我运行 Django 控制台时 SECRET KEY失踪了 这是应该的
  • 如何在 Perl 中增加带有前导零的值?

    这是同样的问题this one 但是使用 Perl 我想迭代一个只有一个前导零的值 shell 中的等价物是 for i in seq w 01 99 do echo i done 由于前导零很重要 因此您可能希望将它们用作字符串 而不是数
  • 获取添加的 DOM 节点的 className (mutationObserver)

    我正在编写一个简单的用户脚本 如果 Facebook 帖子包含特定的单词列表 它将自动隐藏该帖子 核心功能有效 但我的MutationObserver似乎没有读过className of mutation addedNodes适当地 我循环
  • char 与 wchar_t

    我正在尝试打印出 wchar t 字符串 代码如下 include
  • 如何验证 ASP.Net MVC 2 中的复选框?

    使用 MVC2 我有一个简单的 ViewModel 其中包含一个布尔字段 该字段在视图上呈现为复选框 我想验证用户是否选中了该框 我的 ViewModel 上的 Required 属性似乎不起作用 我相信这是因为未选中的复选框表单字段实际上
  • 重写虚函数仅因调用约定不同是什么意思?

    我正在尝试实施IUnknown 我按照发球台的说明进行操作 但不起作用 当我尝试编译时 我得到 Error 2 error C2695 testInterfaceImplementation AddRef overriding virtua
  • 是否可以检测 Android 强制门户浏览器?

    我有一个强制门户 从 Android 5 0 Lollipop 开始 它在 Android 的强制门户浏览器而不是设备的默认浏览器中启动 我需要以某种方式检测它们是否在强制门户浏览器中 而不是常规网络浏览器 如果是 则显示不同的内容 是否可
  • 服务器端 Blazor 不提供 HttpClient 进行注入

    当我尝试注入 HttpClient 时 我在 razor 页面中收到错误 未处理的承诺拒绝 错误 System InvalidOperationException 无法为类型上的属性 Http 提供值 没有 类型为 System Net H
  • 使用 Visual Studio 开发服务器时如何让 Web 服务使用固定端口号?

    我有一个 ASP NET 网站和一个 Windows 窗体应用程序 我的网络服务的位置是 http localhost 12312 MyWebSiteFolder WSFile asmx 问题是 端口号不断变化 如果我重新打开解决方案 它会
  • 在获取聊天历史记录时,我没有从 Openfire 获取用户历史记录

    我通过在 open fire 中安装 open fire 插件来从 openfire 获取历史记录并尝试了这段代码 let iq1 DDXMLElement name iq iq1 addAttribute withName type st
  • Kotlin中如何在延迟后调用函数?

    如标题 有没有办法在延迟 例如1秒 后调用函数Kotlin 还有一个选项可以使用Handler gt postDelayed Handler postDelayed doSomethingHere 1000
  • 处理可选的 python 字典字段

    我正在处理加载到 Python 字典中的 JSON 数据 其中很多都有可选字段 其中可能包含字典之类的东西 dictionary1 required value1 one value2 two optional value1 one dic
  • 使 Java 类通用,但仅适用于两种或三种类型

    我很惊讶在 stackoverflow 上找不到这个问题 我只能将其归咎于我的谷歌搜索不佳 无论如何都要指出重复的问题 这是一个玩具类 它返回与您放入其中的内容相反的内容 目前它适用于整数 但只需要非常小的更改即可适用于字符串 public