2013-03-18 3 views
0

я не могу правильно написать универсальный метод для этого:Java универсального типа с массивами

private int [] loadIntArray(String key, int [] defaultArray) { 
    int [] array = new int [4]; 
    for(int index=0; index<4 ; index++) { 
     array[index] = sp.getInt(key + index, defaultArray[index]); 
    } 
    return array; 
} 

Я написал:

private <T[]> loadArray(String key, <T[]> defaultArray) { 
    <T[]> array = new <T[LEVELS]>; 
    for(int index=0; index<4 ; index++) { 
     array[index] = sp.getInt(key + index, defaultArray[index]); 
    } 
    return array; 
} 

Но он не компилируется.
Я получаю несколько ошибок: «Тип возврата для метода отсутствует», «Тип, ожидаемый после частного токена».

Что было бы правильным способом написать его?

ответ

2

Вы вернете массив типа T, а не определенный тип T[].

Это будет больше в том направлении, в котором вы хотите отправиться.

private <T> T[] loadIntArray(String key, T[] defaultArray) { 
    T[] array = new T[4]; // Need more info to correct this 
    for (int index = 0; index < 4; index++) { 
     array[index] = sp.getInt(key + index, defaultArray[index]); 
    } 
    return array; 
} 
+0

Почти идеальный! «Новый T [4]' все еще не компилируется »Невозможно создать общий массив T» – ilomambo

+2

Прочтите это! http://stackoverflow.com/questions/4013683/creating-generic-arrays-in-java –

0

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

private <T> T[] loadArray(String key, T[] defaultArray) 
3

Для того, чтобы добиться того, что вы должны добавить class parameter к вашему методу

Class<T> type 

вашего метода теперь посмотрите как указано ниже

private <T> T[] loadArray(Class<T> type, String key, T[] defaultArray) { 
     T[] array = (T[]) Array.newInstance(type, defaultArray.length); 
     for (int index = 0; index < array.length; index++) { 
     array[index] = sp.getInt(key + index, defaultArray[index]); 
     } 
     return array; 
    } 

Обновление после вопроса:
Как бы выглядел вызов этого метода? (например, для типа «int»)?

При создании объекта Pair, вы не можете заменить примитивный тип параметра типа K или V:

Pair<int, char> p = new Pair<>(8, 'a'); // ошибка времени компиляции Вы можете заменить только непримитивными типов для параметров типа K и V:

Pair<Integer, Character> p = new Pair<>(8, 'a'); 

Возможный обходной путь
(. единственный способ передать его в общем виде и сохранить его как примитивный массив как объект)

Object a[]= {1,2,3}; 
loadArray(Object.class, "test", a); 

Или вы можете использовать не тип primitiv (Integer)

Integer a[]= {1,2,3}; 
loadArray(Integer.class, "test", a); 
+0

Как бы выглядел вызов этого метода? (например, для типа «int» – ilomambo

+1

Единственный способ передать его в общем виде и сохранить его как примитивный массив как объект. –

+0

Спасибо, я возьму его отсюда! – ilomambo

0

Это ОП.
Хотя это не отмеченный ответ, я хотел опубликовать окончательный код, который компилируется для тех, кто хочет его увидеть.

Одна важная вещь, о которой не упоминалось в других ответах, заключается в том, что Java-дженерики не поддерживают типы примитивов типа (int, float, ...)). Поэтому мне пришлось изменить свои массивы на Integer и Float.

private <T> void loadArray(final T[] array, final String key, final T[] defaultArray) { 
    int count = array.length; 
    for(int index = 0; index < count; index++) { 
     //if(array[index] instanceof PointF) { 
     if(array instanceof PointF[]) { 
      PointF element = new PointF(); 
      element.x = sp.getFloat(key + index, (Float) defaultArray[index]); 
      element.y = sp.getFloat(key + index, (Float) defaultArray[index]); 
      array[index] = (T) element; 
     //} else if(array[index] instanceof Float) { 
     } else if(array instanceof Float[]) { 
      Float element = sp.getFloat(key + index, (Float) defaultArray[index]); 
      array[index] = (T) element; 
     //} else if(array[index] instanceof Integer) { 
     } else if(array instanceof Integer[]) { 
      Integer element = sp.getInt(key + index, (Integer) defaultArray[index]); 
      array[index] = (T) element; 
     } 
    } 
} 

Редактировать
Оказывается, что если массив имеет такие размеры, но не инициализирована,

array[index] instanceof Integer 

возвращается false, поэтому я изменил тест на

arrray instanceof Integer[] 

который возвращает true, даже если массив eleme nts: null.

1

Предполагая defaultArray всегда будет nil и всегда будет массив типа компонента T, вы можете использовать его тип, чтобы построить новый массив:

import java.lang.reflect.Array; 

private <T> T[] loadIntArray(String key, T[] defaultArray) { 
    T[] array = (T[])Array.newInstance(defaultArray.getClass().getComponentType(), 4); 
    for (int index = 0; index < 4; index++) { 
     array[index] = sp.getInt(key + index, defaultArray[index]); 
    } 
    return array; 
} 

Обратите внимание, что, однако, если время исполнения defaultArray «s type - массив некоторого подтипа T, это не сработает. Это вызовет ArrayStoreException.

Смежные вопросы