我有几个函数需要精确的参数类型(又名T
):
private <T> void doWork1(T _obj) {...}
private <T> void doWork2(T _obj) {...}
private <T> void doWork3(T _obj) {...}
我像这样使用它们并且工作正常:
public void parse(int id) {
switch (id) {
case 1: {
Integer obj = new Integer(1);
doWork1(obj);
doWork2(obj);
doWork3(obj);
break;
}
case 2: {
Double obj = new Double(2);
doWork1(obj);
doWork2(obj);
doWork3(obj);
break;
}
case 3: {
CustomClass obj = new CustomClass();
doWork1(obj);
doWork2(obj);
doWork3(obj);
break;
}
}
}
但我想知道是否可以使代码更简洁,即
public void parse(int id) {
UnknownType obj;
switch (id) {
case 1: {
obj = new Integer(1);
break;
}
case 2: {
obj = new Double(2);
break;
}
case 3: {
obj = new CustomClass();
break;
}
}
doWork1(obj);
doWork2(obj);
doWork3(obj);
}
如果是这样,我应该放什么而不是UnknownType
?
修改
1)我使用Integer
和Double
作为简化示例。在我的实际代码中,我使用自定义类。
2)我需要知道doWork
函数中的确切类型(类),因此我无法使用Object
提前致谢
答案 0 :(得分:4)
使用Number
的{{1}}类型。 obj
和Integer
都扩展了这种类型。
抽象类{@code Number}是平台的超类 表示可转换为的数值的类 原始类型{@code byte},{@ code double},{@ code float},{@ code int},{@ code long}和{@code short}。
Double
如果您不想这样具体,可以随时使用public void parse(int id)
{
Number obj = null;
switch (id)
{
case 1:
{
obj = new Integer(1);
break;
}
case 2:
{
obj = new Double(2);
break;
}
}
doWork1(obj);
doWork2(obj);
doWork3(obj);
}
。
答案 1 :(得分:2)
您可以使用Number
或Object
,它们都是Integer
和Double
的常见超类型。
然而,泛型是不必要的:
private <T> void doWork1(T _obj) {...}
与
相同private void doWork1(Object _obj) {...}
擦除后。
为输入参数设置类型变量的唯一要点是:
您需要指明其他输入参数的泛型需要相关,例如您正在通过T _obj
和List<T> _list
。
请注意,您不需要T _obj1
和T _obj2
的通用类型 - 它会退化为T
的上限(例如Object
)
如果您需要它与返回类型相关:
<T> T doWork1(T _obj) { ... }
你在这里不需要任何一个案例,所以只需删除不必要的并发症。