使用一组固定类型之一参数化类

2023-12-27

假设我有一个通用类Foo它可以保存类型的对象T。此外,假设我only希望能够使用两种类型之一的对象实例化该类。最后,假设这两种类型的最低公共上限是一种比我想要允许的两种类型拥有更多子类的类型,因此我不能简单地为类型参数指定一个上限(如class Foo<T extends Something>),因为这样我将允许使用除我期望的两种类型以外的其他类型来实例化该类。

为了便于说明,假设我想要Foo持有only要么是String or an Integer。最低公共上限是Object,因此指定上限并不能解决问题。

当然,我可以做一些类似的事情

class Foo<T> {

    private T obj;

    public Foo(T obj) throws IllegalArgumentException {
        if (!(obj instanceof String || obj instanceof Integer)) {
            throw new IllegalArgumentException("...");
        }
        this.obj = obj;
    }
}

但是,在这种情况下,我仍然可以使用以下命令调用构造函数any目的;如果我尝试用既不是String nor an Integer,我会得到一个例外runtime.

我想做得更好。我希望编译器静态推断(即,在编译时间)我只能用以下对象实例化此类String or Integer.

我在想类似的东西可能会起作用:

class Foo<T> {

    private T obj;

    public Foo(String s) {
        this((T) s);
    }

    public Foo(Integer i) {
        this((T) i);
    }

    private Foo(T obj) {
        this.obj = obj;
    }
}

这可行,但看起来真的非常奇怪。编译器会警告(可以理解)未经检查的强制转换。当然,我可以抑制这些警告,但我觉得这不是正确的方法。另外,看起来编译器实际上不能infer方式T。我惊讶地发现,后面的类定义Foo,我可以这样做,例如:

Foo<Character> foo = new Foo<>("hello");

当然,类型参数应该是String在这里,不Character。但编译器让我摆脱了上面的分配。

  1. 有没有办法实现我想要的,如果是的话,如何实现?
  2. 附带问题:为什么编译器让我逃脱对类型对象的赋值Foo<Character>上面甚至没有一个warning(当使用后一个类定义时Foo)? :)

尝试使用static工厂方法以防止编译器警告。

class Foo<T> {

    private T obj;

    public static Foo<String> of(String s) {
        return new Foo<>(s);
    }

    public static Foo<Integer> of(Integer i) {
        return new Foo<>(i);
    }

    private Foo(T obj) {
        this.obj = obj;
    }
}

现在您使用以下命令创建实例:

Foo<String> foos = Foo.of("hello");

Foo<Integer> fooi = Foo.of(42);

Foo<Character> fooc = Foo.of('a'); // Compile error

然而,以下内容仍然有效,因为您可以声明任何类型 T 的 Foo,但不能实例化它:

Foo<Character> fooc2;

Foo<Character> fooc3 = null;

Foo<Object> fooob1;

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

使用一组固定类型之一参数化类 的相关文章

  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • 搜索未排序的数组

    也可能具有重复元素的未排序数组中的最小和最大比较次数是多少 我知道在未排序的数组中查找任何内容都是 O n 问题 但是 如果数组也包含重复元素 这是真的吗 我所说的重复元素是指在给定数组中多次出现的元素 所以这里的想法是你必须从头到尾遍历数
  • 互斥体是如何实现的?

    对于特定应用程序 某些实现是否比其他实现更好 通过推出自己的产品有什么收入吗 查看描述测试和设置 http en wikipedia org wiki Test and set维基百科上的机器指令 它暗示了如何在机器级别实现原子操作 我可以
  • 使用 PHP 发送文件时在 Internet Explorer 中维护自定义文件扩展名?

    我有一个服务器端 zip 存档 我想将其作为下载传递 我正在使用自定义扩展将这些特定档案与某些客户端软件相关联 例如 CustomArchive bwz Chrome 和 FireFox 可以完美处理此自定义扩展 但 Internet Ex
  • 带Executor和不带Executor的多线程区别

    我试图找出普通多线程和使用执行器的多线程 维护线程池 之间的性能差异 以下是两者的代码示例 没有执行器代码 使用多线程 import java lang management ManagementFactory import java la
  • 使用 iText 生成波斯语 PDF

    Hi 我知道很多人之前可能都问过这个问题 我几乎读过所有这些 但它无法帮助我解决我的问题 我正在使用 iText java 库生成波斯语 PDF 我正在使用以下代码 Document document new Document PageSi
  • 如何防止浏览器预加载

    我用 JavaScript 为 Chrome 编写了一个用户脚本扩展 以防止视频和音频标签在页面加载时自动下载 这是代码 var videoTags document getElementsByTagName Video var i for
  • 如何在保存到 Parse.Cloud.beforeSave 之前将照片调整为多种照片尺寸

    首先让我先说我让这段代码完美地工作以获得缩略图 https parse com docs cloud modules guide images https parse com docs cloud modules guide images
  • Google 计算器千位分隔符特殊字符

    注意 有关此问题的更多答案 请参阅Google 计算器中的特殊字符 https stackoverflow com questions 12867450 special characters in google calculator 我注意
  • 构建与系统具有相同证书的Android APK

    我正在尝试让系统应用程序正常工作 这是我所拥有的 具有完整 4 4 2 源代码的 OEM OMAP 平台 我已经使用 Ubuntu 14 04 构建了系统并加载到我的平台上 这一切都有效 现在 有一个来自 OEM 的应用程序可以直接访问硬件
  • Chartjs-plugin-annotation 与 ng2-charts 的正确配置位置?

    我在用着ng2 charts在我的 Angular 应用程序中绘制条形图 在某些时候 我不得不向我的图表添加静态线 我决定使用chartjs plugin annotation 将这两个库连接在一起没有很好的记录 但经过一些谷歌搜索后 我最
  • cmake 中何时应使用 PUBLIC/PRIVATE/INTERFACE 的示例

    我正在阅读有关 cmake 关键字的内容PUBLIC PRIVATE INTERFACE并发现了这一段here https cmake org cmake help latest manual cmake buildsystem 7 htm
  • Jquery textarea val() 不换行

    我得到一个带有 keyup 函数的文本区域 当用户输入内容时 我希望该文本呈现在 blockquote 标记内 它可以工作 但 id 不接受换行符和空格 你能帮我吗 post body keyup function blockquote f
  • ViewHolder中View类型的字段itemView引用了什么?

    我想弄清楚这个领域是什么itemView实际上是 这是我从文档中获取的代码片段 public abstract static class ViewHolder NonNull public final View itemView other
  • iOS9 中的 UIDatePicker 问题

    日期隐藏在UIDatePicker在iOS9中 我正在使用xib 此问题仅在xoode7 iOS9 中出现 Can any one help me to solve my issue 我认为这是新字体 San Francisco 字体比 H
  • Ruby:如何计算一个字符串在另一个字符串中出现的次数?

    我正在尝试计算一个字符串在另一个字符串中出现的次数 我知道你可以计算一个字母在字符串中出现的次数 string aabbccddbb string count a gt 2 但是 如果我搜索 aa 在此字符串中出现的次数 我也会得到两次 s
  • 发现MySql有一个弱转义函数,如何利用?

    在我正在开发的一个应用程序中 我发现了一个弱转义函数来防止注入 我试图证明这一点 但我很难想出一个简单的例子 转义函数的工作原理如下 PHP 示例 function escape value value str replace value
  • 寻找完整的 Delphi (object pascal) 语法

    我需要完整的 Object Pascal 语法 最好是 Delphi 2009 帮助文件给出了一些语法 但并未提供所有信息 所以我开始收集零散的信息 最近我将这些添加到或多或少完整的语法描述中 类似 EBNF 尽管它看起来很广泛 但仍然存在
  • 从自身内部替换 std::function (通过移动赋值给 *this?)

    可以换一个吗std function从自身内部与另一个std function 以下代码无法编译 include
  • 使用 findbugs 进行 java 编译错误。 com.sun.tools.javac.code.Symbol$CompletionFailure:javax.annotation.meta.When 未找到的类文件

    我正在尝试使用 findbugs 1 3 2 的注释 我用的是edu umd cs findbugs annotations NonNull简单测试中的注释 而且效果很好 但是 现在我有一个大项目 由子模块组成 使用maven 通过在某些
  • 使用一组固定类型之一参数化类

    假设我有一个通用类Foo它可以保存类型的对象T 此外 假设我only希望能够使用两种类型之一的对象实例化该类 最后 假设这两种类型的最低公共上限是一种比我想要允许的两种类型拥有更多子类的类型 因此我不能简单地为类型参数指定一个上限 如cla