2013-02-08 2 views
1

Как я могу вызвать функцию массива в Java?Вызов перегруженной функции на Java?

В настоящее время это выглядит следующим образом:

public static void WriteLine(Object Array[]) { 
    for (int I = 0; I < Array.length; ++I) { 
     Out.println(Array[I]); 
    } 
} 

public static void WriteLine(Object Text) { 
    Out.println(Text); 
} 

Я также попытался:

public static <T> void WriteLine(T Array[]) { 
    for (int I = 0; I < Array.length; ++I) { 
     Out.println(Array[I]); 
    } 
} 

и в моей основной, я:

int[] I = new int[]{1, 2, 3, 4, 5}; 
WriteLine(I); 

Я также попытался:

WriteLine<int[]>(I); 

Не работает ..

Он печатает: [I @ 2f56f920

ака адрес INT Array. Как я могу явным образом вызвать конкретную функцию массива или как заставить компилятор узнать, какой из них можно вызвать автоматически (неявно)?

Я не привык к Java/дженериков/объект еще .. Просто переехал из C++ и использовать для шаблонов :(

+0

Нет. Я хочу, чтобы он печатал любые массивы. – Brandon

+0

Ужасный стиль. Что случилось с I как индекс для цикла? Вы пишете FORTRAN до недавнего времени? Изучите стандарты стиля кодирования Sun Java. – duffymo

+2

После того, как вы выясните решение этого вопроса, начните следовать соглашениям об именах Java. – adarshr

ответ

5

int не является Object так что int[] не является Object[]:

Integer[] I = new Integer[]{1, 2, 3, 4, 5}; 
WriteLine(I); 

Или вы должны WriteLine перегружены для всех примитивных типов:

public static void WriteLine(int Array[]) { 
... 
public static void WriteLine(long Array[]) { 
... 
+0

Ahh .. В штучной упаковке. Вместо этого я перейду на перегрузку всех примитивных типов. Спасибо, что нашли время ответить. Я буду принимать это как ответ. Я думал, что есть способ явно вызвать конкретную перегрузку. – Brandon

+2

Вот почему существует 9 'java.util.Arrays.toString' методов. – jdb

1

Я бы назвал свой массив нечто иное, чем «массив», как Java путает класс массива с объектом или T общего класса. Вы можете также рассмотреть возможность использования StringBuilder, если все, что вы хотите, это печать каждого элемента вашего массива.

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

Должно быть достаточно хорошо.

Если вы действительно хотите использовать StringBuilder, а затем распечатать, сделать это:

public static void write(Object arr[]) { 
    sb = new StringBuilder(); 
    for (int i = 0; i < arr.length; ++i) { 
     sb.append(arr[i] + " "); 
    } 
    System.out.println(sb.toString()); 
} 
+0

Я бы назвал это еще кое-что, но это не проблема. 'Array', вероятно, еще не импортирован, но это все равно не путало бы компилятор. Например: http://ideone.com/sFgpo7 –

1

массив примитива подтип java.lang.Object. Перегрузка разрешается во время компиляции и выбирается наиболее специфический метод, который в случае writeLine (текст объекта).

0

У вас есть два варианта, чтобы убедиться, что правая функция называется:

1-

Object[] objArray = new Object[] { 1, 2, 3, 4, 5 }; 

2-

Integer[] integerArray = new Integer[] { 1, 2, 3, 4, 5 }; 

На стороне записки, вы должны следовать Java naming conventions.например, имя метода должно быть writeLine, а индексная переменная в цикле должна быть small case

+0

Хм .. Почему маленький случай? Я сделаю это, но я не знаю, почему маленький случай так важен для java? Я читаю руководство по условным обозначениям кого-то выше, связавшего меня с атмом. Кажется, у вас тонкий маленький случай, как вы предлагаете. Только для стиля? – Brandon

+1

Следуя соглашению об именах языков, ваш код более читабельен для других программистов, иначе это может показаться странным и раздражающим. У каждого языка есть другое соглашение об именах, например 'WriteLine' подходит для таких языков, как' C# ', но должно быть' writeLine' на Java. – iTech