我有一个班级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中正确地执行此操作,并考虑到最佳执行速度?
答案 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
,除非你有硬数字显示它会减慢你的速度。