如何在通用参数中指定我的数据类型

时间:2018-12-14 12:04:48

标签: java generics

嘿,我想做的事情与Java泛型有关,是否可以在参数中指定类的泛型类型?我不能很好地描述它,这就是为什么我要举一个例子,尝试以下类的原因:

public class List<T>

是否可以指定我的T,因为我希望它是整数或布尔值?

4 个答案:

答案 0 :(得分:3)

您不能直接按照ernest_k的说明在通用类类型中指定此约束,因为这两个可能的类型没有eps共同的祖先,这意味着最终没有约束。
但是您仍然可以使您的类API强制此约束。
将构造函数设为私有,并提供工厂方法代替。

Object

并使用它,例如:

public class Foo<T> {

    private Foo(){}

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

    public static Foo<Boolean> ofBoolean(){
        return new Foo<>();
    }

}

答案 1 :(得分:0)

根据另外this个SO问题,答案是否定的。

如果您想使用IntegerBoolean,则也不能使用该先前答案中定义的方法,因为据我所知,没有仅常见的类 IntegerBoolean数据类型。

对于您而言,简单地创建接受IntegerBoolean参数的替代可能会更容易。

答案 2 :(得分:0)

是的,您可以更清楚地指定T的值。 如果要将其限制为单个类型,可以使用List<Integer>List<Boolean>。 您还可以使用类似以下内容的方法:List<T extends Number>,它将仅接受整数,浮点数......

答案 3 :(得分:0)

如果您没有确切的类,其子类为Boolean和Integer,则不能严格这样定义List。

您可以将列表定义为:

List<? super Object> list = new ArrayList<>();

但是在这种情况下,您可以在其中放置每个扩展Object的类,这当然不是您想要的,但是对于类似的问题可能会有帮助。

例如:

当您上过诸如动物,猫,狗之类的课程时。

然后您可以列出以下列表:

List<? super Animal> list = new ArrayList<>();

并在其中添加Animal的所有子类:)