Вы можете фактически сделать что-то вроде этого:
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
, который implements Comparable<Date>
, и бесчисленное множество других типов, но, вероятно, это лучшее, что вы можете сделать, если вы также хотите разрешить Integer
и Character
.
Тем не менее, имейте в виду, что Integer
, Character
, String
, являются все Object
, поэтому на самом деле куча тех смешаны вместе IS список из одного типа: Object
.
К счастью, это NOT корпус Object implements Comparable<Object>
; в противном случае вышеуказанное решение не сработает.
Вы проверили свой метод? Он работает для {1, 'a', 3}? – hgulyan
@hgulyan: Это будет, потому что T будет выведен как объект типа. – Cowan
@ Кован, хорошо, спасибо. – hgulyan