Java: как насчет моего classOf и newArray? - PullRequest
1 голос
/ 25 октября 2010

Здесь , я задумался о том, как правильно реализовать Collection#toArray(T[] array).Меня больше всего раздражало, что array.getClass().getComponentType() имеет тип Class<?>, а не Class<? extends T>, как я ожидал.

Поэтому я закодировал эти три функции:

@SuppressWarnings("unchecked") static <T> Class<? extends T> classOf(T obj) {
    return (Class<? extends T>) obj.getClass();
}

@SuppressWarnings("unchecked") static <T> Class<? extends T> classOf(T[] array) {
    return (Class<? extends T>) array.getClass().getComponentType();
}

@SuppressWarnings("unchecked") static <T> T[] newArray(Class<T> clazz, int size) {
    return (T[]) Array.newInstance(clazz, size);
}   

И затемМоя реализация toArray выглядит следующим образом:

    public <T> T[] toArray(T[] array) { 
        int size = size();
        if (array.length < size) { 
            array = newArray(classOf(array), size);
        } else if (array.length > size) {
            array[size] = null;
        }

        int i = 0;
        for (E e : this) {
            array[i] = classOf(array).cast(e);
            i++;
        }
        return array;
    } 

Что меня интересует сейчас:

Всегда ли безопасны эти 3 вспомогательные функции?Esp., Всегда ли приведение типов безопасно?

Почему эти функции еще не в Java?

Также см. Очень похожие вопросы: T obj для универсального типа T.Тип obj.getClass() равен Class<?>, а не Class<? extends T>.Почему?

1 Ответ

1 голос
/ 29 октября 2010

Ваш код выглядит довольно хорошо, но вы можете использовать java.util.Arrays.copyOf, чтобы упростить свою жизнь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...