Java如何:通用类创建通用数组?

时间:2012-09-08 04:34:02

标签: java generics

我有一个班级FirstClass<O>和一个班级SecondClass<O>,我希望在SecondClass<O>内的FirstClass<O>中调用O []。 O是泛型类参数。我没有找到如何做到这一点。

我需要一个O []专门(而不是ArrayList<O>或类似的)因为我需要经常从循环体内获取元素,这对我算法的执行时间很重要。 / p>

所以我想要这些内容。

public class FirstClass<O> {
    void someRoutine(n and other params) {
        //Do some stuff
        SecondClass<O> = new SecondClass(n, possibly_other_params);
        //Do some stuff
    }
}

public class SecondClass<O> {
    O[] myArray;
    SecondClass<O>(int n, possibly_other_params) {
        //Here the constructor that creates an O[n]
    }
}

我在网上找到的一些方法,但不适合我的情况:

  • 使用O[] array = (O[]) new Object[n];但不能编译。
  • 使用Object[] array = new Object[n];并在每次向阵列请求内容时执行(O)演员,但这太慢了
  • 使用Array.newInstance(Class<O> type, int n);O o;type=o.class,但它抱怨type现在属于Class<CAP#1>类型,而不是类型Class<O>,无论如何CAP#1意味着......

我应该如何在Java中正确地执行此操作,并考虑到最佳执行速度?

4 个答案:

答案 0 :(得分:3)

Java对泛型的处理非常粗糙,但如果您准备进行小的调整,您可以完成一些接近您想要的东西。请参阅:

public class FirstClass<O> {
    Class<O> type;

    public static <O> FirstClass<O> create(Class<O> type) {
        return new FirstClass<O>(type);
    }

    public FirstClass(Class<O> type) {
        this.type = type;
    }

    public void routine(int size /*, other params */ ) {
        SecondClass<O> instance = new SecondClass<O>(type, size);
    }
}

public class SecondClass<O> {
    public O[] array;

    @SuppressWarnings("unchecked")
    public SecondClass(Class<O> type,int size) {
        array = (O[])Array.newInstance(type,size);
    }
}

用例:

FirstClass<Integer> instance = FirstClass.create(Integer.class);
instance.routine(110);

这只是一个粗略的例子,虽然我相信你可以在不使用这种方法的情况下完成类似的事情。

答案 1 :(得分:1)

  

使用O [] array =(O [])new Object [n];但这需要(O)演员   每次我从数组中请求某些东西时,这都太慢了

什么? O[]类型的全部内容是,当您从中获取内容时需要(O)演员

答案 2 :(得分:0)

重复我的评论,希望将此问题标记为已回答:

你真的对此有所描述吗?铸造实际上是什么导致您的性能问题?鉴于Java中的泛型在运行时被删除,我在这里看不到一个简单的解决方法,以使其按预期运行。我认为你最好不要试图重新访问你期望的API,然后尝试让Java的泛型以你想要的方式工作。

答案 3 :(得分:0)

以下是ArrayList.set的{​​{3}}:

public E set(int index, E element) {
    rangeCheck(index);

    E oldValue = elementData(index);
    elementData[index] = element;
    return oldValue;
}

当然,它会进行额外的查找以获取您不关心的旧元素,但这是我们正在谈论的随机访问(读取:O(1)时间)。只需使用ArrayList,除非你有硬数字显示它会减慢你的速度。