in src/main/java/net/hydromatic/linq4j/expressions/Types.java [432:466]
public static Expression castIfNecessary(Type returnType,
Expression expression) {
final Type type = expression.getType();
if (Types.isAssignableFrom(returnType, type)) {
return expression;
}
if (returnType instanceof Class
&& Number.class.isAssignableFrom((Class) returnType)
&& type instanceof Class
&& Number.class.isAssignableFrom((Class) type)) {
// E.g.
// Integer foo(BigDecimal o) {
// return o.intValue();
// }
return Expressions.unbox(expression, Primitive.ofBox(returnType));
}
if (Primitive.is(returnType) && !Primitive.is(type)) {
// E.g.
// int foo(Object o) {
// return ((Integer) o).intValue();
// }
return Expressions.unbox(
Expressions.convert_(expression, Types.box(returnType)),
Primitive.of(returnType));
}
if (!Primitive.is(returnType) && Primitive.is(type)) {
// E.g.
// Short foo(Object o) {
// return (short) (int) o;
// }
return Expressions.convert_(expression,
Types.unbox(returnType));
}
return Expressions.convert_(expression, returnType);
}