我最近一直在做一些Java(主要是作为对我在大学所做的事情的回顾,因为我现在的工作根本不涉及任何Java)并且从未正确介绍过的一件事是泛型。
我在Oracle Java网站上一直在做泛型教程,而且我已经被以下修改过的示例所困扰了:
public static <Integer extends Comparable<Integer>> int countGreaterThan(Integer [] anArray, Integer elem) {
int count = 0;
for (Integer e : anArray)
if (e.compareTo(elem) > 0)
++count;
return count;
}
我使用此方法将Integer数组与以下Integer进行比较:
Integer [] numarr = {1, 2, 3, 4 , 5};
Integer num = new Integer(5);
int count = Util.countGreaterThan(arrnum, num);
这似乎工作正常,但是如果我传递一个原始数组和一个原始int,它就不会:
int [] arrnum = {1, 2, 3, 4 , 5};
int othernum = 3;
int count = Util.countGreaterThan(arrnum, othernum);
编译器抱怨:
method countGreaterThan in class Generics.Util
cannot be applied to given types;
required: Integer[],Integer
found: int[],int
reason: no instance(s) of type variable(s)
Integer exist so that argument type int conforms to formal parameter type Integer
教程似乎非常坚定,Java将始终根据需要自动装箱/取消装箱对象和原语,但在这种特殊情况下它不会做到这一点,我缺少什么?
还有什么可能是一种尽可能概括这种比较方法的好方法?如果我使用T而不是Integer,那么它将寻找一个T对象,而不是我传递给它的任何东西。
如果帖子令人困惑,我很抱歉,如果我对上面谈到的内容一无所知,那只是因为我主要是作为一名perl程序员工作(而不是特别有经验的程序员)或者推广这似乎不是一个问题(由于缺乏类型执行)。
提前致谢!
答案 0 :(得分:1)
以下代码似乎可以解决:
public static <Integer extends Comparable<Integer>> int countGreaterThan(Integer [] anArray, Integer elem) {
int count = 0;
for (Integer e : anArray) {
if (e.compareTo(elem) > 0)
++count;
return count;
}
虽然我收到警告"The type parameter Integer is hiding the type Integer"
。请参阅@ErichSchreiner
的答案,了解为什么自动装箱在这里不起作用的解释。
您方法的一个很好的概括是:
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;
}
你真正关心的是anArray
与elem
具有相同类型的元素,并且它与它自己的类型相当。
答案 1 :(得分:1)
您对countGreaterThan()
的声明会隐藏内置类型Integer
。为了澄清,请考虑稍加修改的版本:
public static <I extends Comparable<I>> int countGreaterThan(I [] anArray, I elem) {
int count = 0;
for (I e : anArray)
if (e.compareTo(elem) > 0)
++count;
return count;
}
现在很明显,您的第二次通话尝试无法正常工作,因为无法完成自动装箱。要使泛型工作,您需要提供对象,而不是基元。