相关疑难解决方法(0)

如何在Java中创建通用数组?

由于Java泛型的实现,您不能拥有这样的代码:

public class GenSet<E> {
    private E a[];

    public GenSet() {
        a = new E[INITIAL_ARRAY_LENGTH]; // error: generic array creation
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在保持类型安全的同时实现这一点?

我在Java论坛上看到了这样的解决方案:

import java.lang.reflect.Array;

class Stack<T> {
    public Stack(Class<T> clazz, int capacity) {
        array = (T[])Array.newInstance(clazz, capacity);
    }

    private final T[] array;
}
Run Code Online (Sandbox Code Playgroud)

但我真的不知道发生了什么.

java arrays generics reflection instantiation

1045
推荐指数
15
解决办法
74万
查看次数

java.lang.reflect.Array的性能

由于我在项目中大量使用对数组的反射访问,我决定比较array[index]vs 的性能java.lang.reflect.Array.get(array, index).虽然我预计,反射调用会慢得多,但我惊讶地发现它们的速度要慢10-16倍.

因此,我决定编写一个简单的实用程序方法,它Array#get通过强制转换对象而不是使用本机方法(同样Array#get)来接收给定索引处的数组:

public static Object get(Object array, int index){
    Class<?> c = array.getClass();
    if (int[].class == c) {
        return ((int[])array)[index];
    } else if (float[].class == c) {
        return ((float[])array)[index];
    } else if (boolean[].class == c) {
        return ((boolean[])array)[index];
    } else if (char[].class == c) {
        return ((char[])array)[index];
    } else if (double[].class == c) {
        return ((double[])array)[index];
    } else if (long[].class == c) {
        return ((long[])array)[index];
    } else if (short[].class == …
Run Code Online (Sandbox Code Playgroud)

java arrays reflection performance

15
推荐指数
1
解决办法
1227
查看次数

标签 统计

arrays ×2

java ×2

reflection ×2

generics ×1

instantiation ×1

performance ×1