加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用一组固定类型参数化类

发布时间:2020-12-15 04:49:35 所属栏目:Java 来源:网络整理
导读:假设我有一个泛型类Foo,它可以容纳类型为T的对象.此外,假设我只希望能够使用两种类型之一的对象来实例化该类.最后,假设这两种类型的最低公共上限是一个类型,它比我想要允许的那两种类型有更多的子类,所以我不能简单地为类型参数指定一个上限(如同在类中一样)
假设我有一个泛型类Foo,它可以容纳类型为T的对象.此外,假设我只希望能够使用两种类型之一的对象来实例化该类.最后,假设这两种类型的最低公共上限是一个类型,它比我想要允许的那两种类型有更多的子类,所以我不能简单地为类型参数指定一个上限(如同在类中一样) Foo< T extends Something>),因为那时我将允许使用除我期望的两种类型之外的其他类型来实例化该类.

为了说明,假设我希望Foo只保留String或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;
    }
}

但是,在这种情况下,我仍然可以使用任何对象调用构造函数;如果我尝试使用既不是String也不是Integer来实例化它,我将在运行时获得异常.

我想做得更好.我希望编译器静态地(即,在编译时)推断我只能使用String或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;
    }
}

这有效,但看起来真的很奇怪.编译器警告(可以理解)未经检查的强制转换.当然我可以压制这些警告,但我觉得这不是要走的路.另外,看起来编译器实际上无法推断出类型T.我很惊讶地发现,使用后一个类Foo的定义,我可以做到这一点,例如:

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

当然,type参数应该是String,而不是Character.但编译器让我逃脱了上述任务.

>有没有办法实现我想要的,如果有,怎么样?
>侧面问题:为什么编译器让我逃避对Foo< Character>类型的对象的赋值.上面甚至没有警告(当使用Foo类的后一个定义时)?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读