2012-02-11 4 views
1

У меня есть эта функция;Параметр для всех примитивных типов Java?

static public void Print(Object[] arr) { 
    for(int i = 0; i < arr.length; i++) 
     System.out.println(i + " => " + arr[i]); 
} 

Я хочу использовать это для каждого массива примитивных типов. Разве нет способа сделать это, не переопределяя его для каждого примитивного типа?

Примечание: Это всего лишь пример функции. Я хочу знать технику, если она есть.

+1

Вы не можете сделать это для примитивов. Если ваш дизайн позволяет это, я настоятельно рекомендую вам использовать версии объектов вместо этого. – Perception

+0

@VinceEmigh - потому что примитивы не являются объектами, и нет поддержки языкового уровня для «голого» автоматического бокса от примитивных типов к объектным. – Perception

ответ

2

Нет, это невозможно. Типы элементов массива не обертываются, формальный параметр Object[] неприменим, например. int[] фактический параметр. Вы должны написать один метод для примитивного типа, как в java.util.Arrays. Уродливый, но единственный способ.

1

Да, это называется дженериками. Дженерики - это как шаблоны в C++ - тип переменной.

Посмотрите здесь: http://en.wikipedia.org/wiki/Generics_in_Java

+1

Спасибо. Это сработало для меня; static public void Print (E [] arr) –

+0

Это ... делает? Какая версия Java? Не могли бы вы показать код вызова, пожалуйста? На связанной странице wiki: «public T [] toArray (T ... elements) { return elements; }' В таких случаях вы также не можете использовать собственные типы, например: Integer [] array = toArray (1,2,3,4,5);» - Я получаю «не применимо» для 'int []' и этой подписи. –

+0

Извините, он не работает с параметром типа int [], только Integer []. Ты прав. Я не могу изменить целую структуру. Думаю, это невозможно. –

4

Примитивные массивы объектов в Java, так что вы можете использовать Object -type в качестве параметра (обратите внимание, а не массив объектов, но только объект). Проблема в том, что вам все равно нужно отбросить ее для правильного типа, чтобы иметь возможность итерации массива.

public class ArrayTest 
{ 
    public void paramTest(Object args) 
    {  
     if(args instanceof int[]) 
     { 
      System.out.println("int-array"); 
     } 

     if(args instanceof float[]) 
     { 
      System.out.println("float-array"); 
     } 
    } 

    @Test 
    public void test() 
    { 
     paramTest(new int[5]); 
     paramTest(new float[5]); 
    } 
} 

Выход:

int-array 
float-array 
0

Вы можете использовать Java генериков, как это добиться того, что вы хотите, здесь Number является java.lang.Number:

public static <T extends Number> void print(T[] arr) 
{ 
    for (int i = 0; i < arr.length; i++) 
    { 
     System.out.println(i + " => " + arr[i]); 
    } 
} 

Но это будет работать только для массива Примитивные классы-обертки, а не для примитивных массивов.

+3

Это не сработает, если вы попытаетесь передать «примитивный» примитивный массив, например, вызов 'print (new float [5])' -> 'не применим для аргументов (float [])'. Примитивные массивы не являются автобоксами. – esaj

+0

@esaj, Согласен. Обновил мой ответ, упомянув об этом. Благодарю. –