I have a couple of functions which requires exact argument type (aka T
):
private void doWork1(T _obj) {...}
private void doWork2
User the type Number
for your obj
. Integer
and Double
both extend this type.
The abstract class {@code Number} is the superclass of platform classes representing numeric values that are convertible to the primitive types {@code byte}, {@code double}, {@code float}, {@code int}, {@code long}, and {@code short}.
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);
}
If you do not want to be this concrete, you can always use Object
.
You can use Number
or Object
, which are both common supertypes of Integer
and Double
.
However, the generics are unnecessary:
private <T> void doWork1(T _obj) {...}
is identical to
private void doWork1(Object _obj) {...}
after erasure.
The only point of having a type variable for an input parameter is if:
You need to indicate that the generics of another input parameter need to be related, e.g. you are passing T _obj
and List<T> _list
.
Note that you don't need a generic type for T _obj1
and T _obj2
, though - that degenerates to the upper bound of T
(e.g. Object
);
If you need it to be related to the return type:
<T> T doWork1(T _obj) { ... }
You don't need either case here, so just remove the unnecessary complication.