通用静态方法类型

时间:2017-08-05 18:38:38

标签: java generics

如果type为Integer for static method,我会得到complie time error。

public static <T> int countGreaterThan(T[] anArray, T elem) {
    int count = 0;
    for (T e : anArray)
        if (e > elem)  // compiler error
            ++count;
    return count;
}

然后我用Integer替换T到处都没有问题。

public static <Integer> int countGreaterThan(Integer[] anArray, Integer elem) {
        int count = 0;
        for (Integer e : anArray)
            if (e > elem)  // compiler error
                ++count;
        return count;
    } 

但是一旦我将更改Integer改为不同的类型,就像R编译错误一样。

public static <R> int countGreaterThan(Integer[] anArray, Integer elem) {
        int count = 0;
        for (Integer e : anArray)
            if (e > elem)  // no Compilation error
                ++count;
        return count;
    }

静态方法类型对此的影响&gt;运营商在这?

3 个答案:

答案 0 :(得分:3)

在您的情况下,<Integer>不是类型java.lang.Integer,而只是类型参数的名称,并且会影响实际所需的类型。此时,它也可以是<T><VAL><POTATO>

在您的情况下,这将等同于以下代码

public static <POTATO> int countGreaterThan(POTATO[] anArray, POTATO elem) {
    int count = 0;
    for (POTATO e : anArray)
        if (e > elem)  // compiler error
            ++count;
    return count;
}

由于POTATO可以是任何类型,因此编译器不知道如何将其与另一个元素进行比较。编译器不知道如何解释e > elem

当您将类型参数更改为与Integer不同的值时,代码将变为

public static <R> int countGreaterThan(Integer[] anArray, Integer elem) {
    int count = 0;
    for (Integer e : anArray)
        if (e > elem)
            ++count;
    return count;
}

此处类型参数不再是 shadow java.lang.Integer参数,编译器知道如何解释比较。

编辑:我在编辑之前发布了此答案,这改变了您的问题的背景。

答案 1 :(得分:1)

您正在使用<Integer>声明新类型并将其命名为Integer。请注意,这与java.lang.Integer不同,因此不符合以这种方式进行比较的条件。

通过命名新类型R,您在声明java.lang.Integer类型的变量时允许推断Integer

答案 2 :(得分:1)

你正在隐藏Integer,正确的泛型类型这样做是非常难以理解的T extends Comparable<? super T>喜欢

public static <T extends Comparable<? super T>> int countGreaterThan(T[] anArray, 
            T elem) {
    int count = 0;
    for (T e : anArray) {
        if (e.compareTo(elem) > 0) {
            ++count;
        }
    }
    return count;
}

(请使用括号,以便流量控制清晰)。此外,如果您使用的是Java 8+,则可以使用Stream之类的

来完成
long count = Stream.of(anArray).filter(x -> x.compareTo(elem) > 0).count();