通用数组作为参数

时间:2015-06-24 19:22:56

标签: java generics

我试图制作以下函数来计算任何数组中不同元素的数量:

public static long distinctElements(T[] ar)
{
    return Arrays.asList(ar).stream().distinct().count();
}

这里的问题是我不能使用' T [] ar'作为参数(Java表示它不知道类型T)。我怎样才能解决这个问题?此函数位于实用程序类中,该类不包含类型T(如ArrayList和TreeSet)。

3 个答案:

答案 0 :(得分:4)

public static <T> long distinctElements(T[] ar)

应该做的神奇。

答案 1 :(得分:2)

Java不知道T是什么。例如,它也是一个类的合法名称。因此,您首先必须定义T是一个类型变量。

您可以通过将其置于返回类型之前的角度来执行此操作,如下所示:

public static <T> long distinctElements(T[] ar) { ... }

另请注意,在您的情况下,您不需要泛型。如果AB的子类型,那么A[]也是B[]的子类型(这是对于泛型的情况,办法)。因此,您还可以按如下方式定义方法:

public static long distinctElements(Object[] ar) { ... }

能够使用与参数完全相同的数组来调用它。

答案 2 :(得分:1)

T未声明,因此编译器抱怨这一点。在方法类声明它:

public static <T> long distinctElements(T[] ar) {
    return Arrays.asList(ar).stream().distinct().count();
}

此外,您可以使用Arrays#stream

轻松创建列表
public static <T> long distinctElements(T[] ar) {
    return Arrays.stream(ar).distinct().count();
}