我有一个通用函数foo,它接受任何类型并打印出来。
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,'a',3}应该无效。它应该是所有数字或所有字符。我想接受所有整数或所有字符。
答案 0 :(得分:6)
你实际上可以这样做:
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 implements Comparable<Integer>
Character implements Comparable<Character>
String implements Comparable<String>
Double implements Comparable<Double>
为了匹配这些类型(可能还有其他类型),我们绑定T
如下:
这包括例如java.util.Date
,implements Comparable<Date>
,以及无数其他类型,但如果您还想允许Integer
和Character
,则可能是最好的。
尽管如此,请注意Integer
,Character
,String
都是Object
,所以实际上是一堆混合在一起的 IS < / strong>一种类型的列表:Object
。
值得庆幸的是,不 Object implements Comparable<Object>
;否则上述解决方案将无效。
答案 1 :(得分:1)
T
部分表示所有args
都属于同一类型。
如果您想将通用类型限制为仅某种类型或子类型(例如整数),您可以执行以下操作: -
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;
}
答案 2 :(得分:0)
我不是一个java开发人员,但你可以选择使用类型为T的对象的泛型集合。
public static <T> T foo(List<T> arg) {
List<T> foo = arg;
for (T t : foo) {
System.out.println(t);
}
return null;
}
答案 3 :(得分:0)
你可以这样做你想做的事情:
YourClass.<Type>foo(params);
具体做法是:
YourClass.<Integer>foo(1, 2, 3);
和
YourClass.<Character>foo('a', 'b', 'c');
答案 4 :(得分:0)
您可以利用foo
返回与输入参数相同的类型<T>
这一事实。
您可以通过定义返回类型来推断<T>
:
Integer i1 = 4;
String s = "string";
final Integer i2 = foo(i1, s); // error, only Integer allowed
如果您未指定返回类型,则类型<T>
将被推断为Object
,因此将接受所有子类。
或者,正如@Finbarr所提到的,您可以通过
推断出类型Foo.<Integer>foo(i1, s); // error, only Integer allowed
答案 5 :(得分:-1)
要声明有界类型参数,请列出类型参数的名称,然后是extends关键字,后跟其上限。
以下方法只接受数字作为参数。
public static <T extends Comparable<T>> T maximum(T firstNumber, T secondNumber)
{
system.out.println(secondNumber.compareTo(firstNumber));
}
如果您不使用Comparable扩展它,那么compareTo()
将无法使用。