【发布时间】:2014-11-16 12:41:36
【问题描述】:
这是一个例子:
import java.util.Collection;
/**
* Created by IDEA on 16/11/14.
*/
public class Size
{
public static int size(Iterable<?> data)
{
if (data instanceof Collection) {
return ((Collection<?>) data).size();
}
int counter = 0;
for (Object i : data) {
counter++;
}
return counter;
}
public static int size(int[] data)
{
return data.length;
}
public static int size(double[] data)
{
return data.length;
}
public static int size(float[] data)
{
return data.length;
}
public static int size(short[] data)
{
return data.length;
}
public static int size(boolean[] data)
{
return data.length;
}
public static int size(char[] data)
{
return data.length;
}
public static <T> int size(T[] data)
{
return data.length;
}
}
size 方法对于所有原始数组都是相同的。有没有办法避免这种冗余?
【问题讨论】:
-
这个问题是关于使用原始类型作为泛型还是关于找到原始数组长度的通用方法?
-
这是关于使用原始类型作为泛型。
-
对于您的具体示例,
public static int size (Object o) { return java.lang.reflect.Array.getLength(o); }可以用作您的阵列案例的替代品。除了size(...)现在将接受任何类型并在运行时抛出IllegalArgumentException,而不是未实现类型的编译时错误之外,这几乎与您的示例的整体行为相同。 -
这在性能方面有什么缺点吗?
-
我不确定,你可以测量一下。但是,我保证您的性能瓶颈(如果有的话)不会在于确定数组的大小。您正在做的任何其他事情都会大大降低这一点。