对参数具有特定约束的通用函数

时间:2015-07-27 21:08:35

标签: java generics

我希望创建一个函数f,它获得一个名为n Number的参数。但是,我还要指定n必须为ComparableAtomicIntegerAtomicLong不是{}}。我该怎么写这个函数?

我试过这个:public static <T extends Number, Comparable<T>> void f(T n)但是这没有用。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

使用public static <T extends Number & Comparable<T>> void f(T n) 代替逗号:

os.Stdout

答案 1 :(得分:3)

多个类型参数边界必须用&分隔,而不是,,例如:

public static <T extends Number & Comparable<T>> void f(T n)

逗号用于分隔多个类型参数声明,例如:

public static <T extends Number & Comparable<T>, S extends Comparator<T>> void f(T n, S m)

根据JLS,类型绑定可以是:

  • 一个类型变量;
  • 或类或接口,后跟一个或多个接口(由&分隔)。

因此,这有效T extends Number & Comparable<T>,但这不是T extends Comparable<T> & Number

请参阅:JLS § 4.4: Type Variables

AdditionalBound:
  & InterfaceType 
     

...

     

声明为类型参数的每个类型变量都有一个绑定。如果没有为类型变量声明绑定,则假定为Object。如果声明了绑定,则它包含:

     

•单个类型变量T

     

•类或接口类型T可能后跟接口类型I1 & ... & In