为什么自动装箱在这种情况下不能用泛型?

时间:2012-07-11 07:58:09

标签: java generics object integer

  

可能重复:
  Java: Array of primitive data types does not autobox

我最近一直在做一些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程序员工作(而不是特别有经验的程序员)或者推广这似乎不是一个问题(由于缺乏类型执行)。

提前致谢!

2 个答案:

答案 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;
}

你真正关心的是anArrayelem具有相同类型的元素,并且它与它自己的类型相当。

答案 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;
}

现在很明显,您的第二次通话尝试无法正常工作,因为无法完成自动装箱。要使泛型工作,您需要提供对象,而不是基元。