У меня есть нечто родовой функции, которое принимает любой тип и распечатывает их.
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} должно быть недопустимым. Это должны или быть все числа или все символы. Я хочу принять или ВСЕ целые числа или ВСЕ Символы.
Я не разработчик Java, но в качестве одного из возможных вариантов вы можете использовать общую коллекцию объектов типа T.
public static <T> T foo(List<T> arg) {
List<T> foo = arg;
for (T t : foo) {
System.out.println(t);
}
return null;
}
Часть 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;
}
Вы можете делать то, что хотите, вот так:
YourClass.<Type>foo(params);
В частности:
YourClass.<Integer>foo(1, 2, 3);
и
YourClass.<Character>foo('a', 'b', 'c');
Фактически вы можете сделать что-то вроде этого:
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!
}
Это использует тот факт, что:
Integer реализует Comparable
Character реализует Comparable
String реализует Comparable
Double реализует Comparable
Итак, чтобы сопоставить эти типы (и, возможно, другие), мы связали T
следующим образом:
Сюда входят вещи, например java.util.Date
, который реализует Comparable
и бесчисленное множество других типов, но, вероятно, это лучшее, что вы можете сделать, если вы также хотите разрешить Integer
и Персонаж
.
Тем не менее, имейте в виду, что Целое число
, Символ
, Строка
, все это Объект
, так что на самом деле куча смешанные вместе ЯВЛЯЕТСЯ списком одного типа: Object
.
К счастью, это НЕ тот случай, когда Object реализует Comparable
; иначе вышеуказанное решение не сработает.