3

我有一个 classFirstClass<O>和一个 class SecondClass<O>,我想在SecondClass<O>一个调用 from 的例程中创建一个 O[] FirstClass<O>,其中 O 是一个通用类参数。我找不到如何做到这一点。

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

所以我想要一些类似的东西。

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);, with O o;andtype=o.class但它抱怨type现在是 typeClass<CAP#1>而不是 type Class<O>,无论 CAP#1 是什么意思......

在考虑最佳执行速度的情况下,我应该如何在 Java 中正确执行此操作?

4

4 回答 4

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);

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

于 2012-09-08T05:57:19.937 回答
1

使用 O[] 数组 = (O[]) new Object[n]; 但这每次我从数组中请求某些东西时都需要(O)强制转换,所以这太慢了

什么?类型的全部意义在于,当你从中取出东西时O[],你不需要演员表(O)

于 2012-09-09T08:59:33.927 回答
0

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

你真的分析过这个吗?选角实际上是导致您的性能问题的原因吗?鉴于 Java 中的泛型在运行时被删除,我看不到一个简单的解决方法来让它按您的预期工作。我认为您最好尝试重新访问您预期的 API,然后尝试让 Java 的泛型以您想要的方式工作。

于 2012-09-08T04:56:28.480 回答
0

这是源代码ArrayList.set

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

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

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

于 2012-09-08T05:01:26.980 回答