Как вы можете написать функцию, которая принимает несколько типов? - PullRequest
1 голос
/ 26 мая 2010

У меня есть функция, которая должна работать с int [] и String [], теперь я сделал ту же функцию с параметром int и параметром String, однако, если она должна идти таким образом, ее работа с копированием и вставкой не выглядит очень организованно, есть ли способ решить эту проблему и поместить эти 4 функции в 2?

    static public void print(String s)
    {
        System.out.println(s);
    }

    static public void print(int s)
    {
        System.out.println(s);
    }

    static public void printArray(String[] s)
    {
        for (int i=0; i<s.length; i++)
            print(s[i]);
    }

    static public void printArray(int[] s)
    {
        for (int i=0; i<s.length; i++)
            print(s[i]);
    }

Спасибо Matthy

Ответы [ 6 ]

10 голосов
/ 26 мая 2010

С помощью автоматической / автоматической коробки вы можете сделать следующее:

public static void print(Object s) {
  System.out.println(s.toString());
}

public static <T> void printArray(T[] arr) {
  for (T t : arr) {
    print(t);
  }
}

Единственным недостатком является то, что аргумент printArray должен быть массивом ссылочного типа, но в отличие от решения varargs это будет работать для любого ссылочного типа.

Редактировать : что касается решения varargs и вопроса @ matthy о объединении двух методов в один (т.е. его обобщении), вы также можете сделать что-то вроде этого:

static public <T> void print(T... ts) {
    for (T t : ts) {
      System.out.print(t + " ");
    }
    System.out.println("");
}

Однако вы все еще не можете вызвать его для массива примитивов:

int[] x = { 1, 2 };
print(x);

Поскольку Java принимает T как int[] и будет выполнять метод toString массива, а не перебирать содержимое. Если вы вызываете его для массива Integer или другого ссылочного типа, он также будет работать.

8 голосов
/ 26 мая 2010
static public void print(String...strings){
    for(String str : strings){
        System.out.println(str);
    }
}

static public void print(int...ints){
    for(int i : ints){
        System.out.println(i);
    }
}
0 голосов
/ 21 мая 2017
class MyClass {
    public static void main(String[ ] args) {
        String name ="David";
        int age = 42;
        double score =15.9;
        char group = 'Z';
        System.out.println(group  + "\n" + name + " \n" + age + " \n" + score);
    }
}
0 голосов
/ 26 мая 2010

Сочетание предыдущих ответов дает:

public class Test {

    static <T> void print(T... ts) {
        for (T t : ts)
            System.out.println(t);
    }

    public static void main(String... args) {
        String[] strArr = { "one", "two" };
        Integer[] intArr = { 3, 4 };
        String str = "five";
        int i = 6;

        print(strArr);
        print(intArr);
        print(str);
        print(i);
    }
}

Выход:

one
two
3
4
five
6
0 голосов
/ 26 мая 2010

Используйте Generics, если применимо к вашему коду:

static <T> void printArray(T[] s)
{
    for (int i=0; i<s.length; i++)
        System.out.println(s[i]);
}
0 голосов
/ 26 мая 2010

Хорошо, базовый класс java.lang.Object соответствует String, а также int, byte, ... (Autoboxing преобразует их в Integer, Byte и т. Д.). Метод String.valueOf() позволяет вам создать строку из них. (функция toString () также доступна)

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