Java: во время выполнения эквивалент приведения между числовыми типами - PullRequest
1 голос
/ 18 мая 2011

Я могу сделать это, когда знаю типы объектов во время компиляции:

int obj1 = 3;
float obj2 = (float)obj1;
int obj3 = (int)obj1;
short obj4 = (short)obj1;

Какой самый простой и эффективный способ произвести такое же преобразование между числовыми типами, когда типы объектов известны во время выполнения?

// given a primitive (or boxed primitive) number class,
// returns a number that's a boxed instance of that class, 
// equivalent in value to the appropriate primitive cast
// (otherwise throws an IllegalArgumentException)
public Number runtimeNumericCast(Number sourceNumber, 
         Class<?> resultType)
{
   ...
}

Number obj1 = 3;  // really an Integer
Number obj2 = runtimeNumericCast(obj1, Float.class); // will return 3.0f
Number obj3 = runtimeNumericCast(obj2, int.class) // will return 3
Number obj4 = runtimeNumericCast(obj3, Short.class) // will return (short)3

Лучшее, что я могу придумать, - это использовать Map<Class<?>, Function<Number,Number>> и объявить одну функцию для каждого из 6 типов числовых примитивов, чтобы вернуть Number.byteValue(), Number.shortValue(), Number.intValue(), Number.longValue(), Number.floatValue() и Number.doubleValue().

1 Ответ

1 голос
/ 18 мая 2011

Я бы так и сделал, за исключением подписи метода, чтобы избежать ненужного приведения:

public <T extends Number> T runtimeNumericCast(Number sourceNumber, 
         Class<T> resultType)
...