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

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(使用前将#替换为@)

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

随机推荐

  • 搜索未排序的数组

    也可能具有重复元素的未排序数组中的最小和最大比较次数是多少 我知道在未排序的数组中查找任何内容都是 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