@finnw Я согласен, что, вероятно, он выглядит чище с 0. Это работает в любом случае, и я не думаю, что у него есть какие-то странные проблемы, потому что в любом случае есть выделение объектов для массива, и это распределение немедленно освобождается после получения ссылки на класс ,

ользую следующую уловку, чтобы получить тип массива определенного класса:

@SuppressWarnings("unchecked")
public static <T> Class<T[]> getArrayType(Class<T> componentType) {
    String arrayClassName = "[L" + componentType.getName() + ";";
    try {
        return (Class<T[]>) Class.forName(arrayClassName);
    } catch (ClassNotFoundException e) {
        throw new UnexpectedException("Can't get the array type for " + componentType, e);
    }
}

Но есть ли более элегантный способ получить это?

Ответы на вопрос(3)

Попробуй это:

@SuppressWarnings({"unchecked"})
public static <T> Class<T[]> getArrayType(Class<T> componentType) {
    return (Class<T[]>) Array.newInstance(componentType, 1).getClass(); 
}

Вы не можете избежать предупреждения, но оно короче и лучше.

 finnw18 янв. 2011 г., 04:05
Длина массива может быть 0
 Mihai Toader18 янв. 2011 г., 04:09
@finnw Я согласен, что, вероятно, он выглядит чище с 0. Это работает в любом случае, и я не думаю, что у него есть какие-то странные проблемы, потому что в любом случае есть выделение объектов для массива, и это распределение немедленно освобождается после получения ссылки на класс ,
Решение Вопроса

Array.newInstance (), который возвращает массив заданного типа.

Делать что-то вроде:

return Array.newInstance(someClass, 0).getClass()

Мог бы получить то, что вы хотите.

Надеюсь, это поможет.

Я бы сделал так же, какЗак Л ноmemoize результат:

import java.lang.reflect.Array;
import java.util.concurrent.ConcurrentMap;
import com.google.common.base.Function;
import com.google.common.collect.MapMaker;

// ...

static Function<Class<?>, Class<?>> TO_ARRAY_FUNC =
    new Function<Class<?>, Class<?>>() {
        @Override
        public Class<?> apply(Class<?> from) {
            return Array.newInstance(from, 0).getClass();
        }
    };

static ConcurrentMap<Class<?>, Class<?>> ARRAY_TYPE_MAP =
    new MapMaker().weakKeys()
                  .weakValues()
                  .makeComputingMap(TO_ARRAY_FUNC);

@SuppressWarnings("unchecked")
public static <T>Class<T[]> getArrayType(Class<T> componentType) {
    return (Class<T[]>) ARRAY_TYPE_MAP.get(componentType);
}
 Zach L18 янв. 2011 г., 04:07
Ну, я только что многому научился из твоего фрагмента :-p
 Jochen Bedersdorfer18 янв. 2011 г., 04:08
Современные JVM довольно хороши в обнаружении побега и немедленно избавятся от newInstance, так что я не буду беспокоиться о кешировании.

Ваш ответ на вопрос