如果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;运营商在这?
答案 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();