【问题标题】:Generic methods for primitive types in java [duplicate]java中原始类型的通用方法[重复]
【发布时间】: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,而不是未实现类型的编译时错误之外,这几乎与您的示例的整体行为相同。
  • 这在性能方面有什么缺点吗?
  • 我不确定,你可以测量一下。但是,我保证您的性能瓶颈(如果有的话)不会在于确定数组的大小。您正在做的任何其他事情都会大大降低这一点。

标签: java generics primitive


【解决方案1】:

不,没有。这就是使用原语的代价。

您可以在java.util.Arrays 类的许多方法中看到这种不可避免的冗余示例,其中每种原始数组都有不同的方法(例如:copyOf、sort、swap 等...)。

【讨论】:

  • 附录:在 OP 的具体示例情况下,Array.getLength() 可用于任何数组类型(参数为Object,长度通过反射确定)。
猜你喜欢
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
相关资源
最近更新 更多