【发布时间】:2012-07-10 19:14:42
【问题描述】:
我最近一直在做一些 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 [] 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 程序员工作(也不是特别有经验的程序员)并且在那里进行概括作为一个小问题(由于缺乏类型强制)。
提前致谢!
【问题讨论】:
-
使用
Integer作为类型变量是个很糟糕的主意
标签: java generics object integer