Как я ограничиваю принятие только одного типа в моем общем методе?

У меня есть нечто родовой функции, которое принимает любой тип и распечатывает их.

public static <T> T foo(T... arg) {
    List<T> foo = Arrays.asList(arg);
    for (T t : foo) {
      System.out.println(t);
    }
    return null;
  }

Как я удостоверяюсь, что полученные аргументы имеют только 1 тип. Например, {1, 3} должно быть недопустимым. Это должны или быть все числа или все символы. Я хочу принять или ВСЕ целые числа или ВСЕ Символы.

7
задан unj2 13 May 2010 в 05:12
поделиться

4 ответа

Я не разработчик Java, но в качестве одного из возможных вариантов вы можете использовать общую коллекцию объектов типа T.

public static <T> T foo(List<T> arg) { 
    List<T> foo = arg; 
    for (T t : foo) { 
      System.out.println(t); 
    } 
    return null; 
  } 
0
ответ дан 7 December 2019 в 12:16
поделиться

Часть T означает, что все аргументы будут одного типа.

Если вы хотите ограничить свой общий тип только определенным типом или подтипом (например, целым числом), вы можете сделать следующее: -

public static <T extends Integer> T foo(T... arg) {
    List<T> foo = Arrays.asList(arg);
    for (T t : foo) {
      System.out.println(t);
    }
    return null;
  }
1
ответ дан 7 December 2019 в 12:16
поделиться

Вы можете делать то, что хотите, вот так:

YourClass.<Type>foo(params);

В частности:

YourClass.<Integer>foo(1, 2, 3);

и

YourClass.<Character>foo('a', 'b', 'c');
0
ответ дан 7 December 2019 в 12:16
поделиться

Фактически вы можете сделать что-то вроде этого:

static <T extends Comparable<T>> void f(T... args) {
    System.out.println(java.util.Arrays.toString(args));
}
public static void main(String[] args) {
    // all one type -- all of these compile!
    f(1, 2, 3); // prints "[1, 2, 3]"
    f('a', 'b', 'c'); // prints "[a, b, c]"
    f("a", "b", "c"); // prints "[a, b, c]"
    f(1D, 2D, 3D); // prints "[1.0, 2.0, 3.0]"

    // this is not preventable
    f(1, (int)'a', 3); // prints "[1, 97, 3]"

    // mixture of types -- none of these compile!
    //f(1, 'a', 3); // compilation error!
    //f(1, '2', "3"); // compilation error!
    //f("a", "b", 'c'); // compilation error!
    //f(1, 2, 3D); // compilation error!
}

Это использует тот факт, что:

Итак, чтобы сопоставить эти типы (и, возможно, другие), мы связали T следующим образом:

Сюда входят вещи, например java.util.Date , который реализует Comparable и бесчисленное множество других типов, но, вероятно, это лучшее, что вы можете сделать, если вы также хотите разрешить Integer и Персонаж .


Тем не менее, имейте в виду, что Целое число , Символ , Строка , все это Объект , так что на самом деле куча смешанные вместе ЯВЛЯЕТСЯ списком одного типа: Object .

К счастью, это НЕ тот случай, когда Object реализует Comparable ; иначе вышеуказанное решение не сработает.

5
ответ дан 7 December 2019 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: