使用反射在Java中动态显式转换基元类型

时间:2011-02-08 14:26:11

标签: java reflection casting

我遇到了参数类型不匹配的问题,而我试图设置一个类似于硬件部分使用泛型的值。

 public static void Main(String... args) {

   int intValue = 1;
   long longValue = 1l;
   Foo foo = new Foo();

  // Easy
  foo.setIntValue(intValue);
  foo.setLongValue(longValue);

  invokeSet(foo, "setIntValue",intValue);
  invokeSet(foo, "setLongValue",longValue);

  //Medium
  foo.setLongValue(intValue);   
  invokeSet(foo, "setLongValue",intValue);

  //Hard
  foo.setIntValue((int)longValue); //How to implement this in generic way ?
  invokeSet(foo, "setIntValue",longValue);
 }

class Foo {

 int intValue = 0
 long llongValue = 0;


  setIntValue(int i) {
    this.intValue = i;
  }

  setLongValue(long l) {
   this.longValue = l;
  }

}

问题是我必须预料到明确的演员?

修改

是否有可能预期缩小原始转换可能会发生并使用反射类型类等以动态方式执行它?

仅供参考:

当我们处理基元类型的反射时,它们不再是原始的。

private static void invokeSet(Object bean, String methodName, Object value) throws Exception {
   Method m = retriveMethod(bean, methodName);
   m.invoke(bean,value); //More or less there is a type wrapper to change primitive to object class
}

EDIT2

实现此目的的一种方法是将值更改为string,然后使用特定类型编号的字符串构造函数传递带有值的字符串。

int intValue = 0;
long longValue = 0l;

Integer intObject = i;
Long longObject = l;

  intValue = (int)longValue;
  intOBject = new Integer(String.valueOf(longObject)); // intObject = (Integer) longValue; this is not allowed 

  intObject = longObject.intValue(); //Target to achieve with out writing bad code.

3 个答案:

答案 0 :(得分:4)

long投射到intnarrowing primitive conversion,可能会导致精度损失,因此永远不会隐式执行。 (除了常量表达式,但在这种情况下这无关紧要。)

答案 1 :(得分:4)

 /**
     * Function that solve the problem with Numbers and narrowing primitive conversion. 
     * @param outputType - The type of output
     * @param value - Number object to be narrowed.
     */
    private static Number NarrovingNumberConversion(Class<? extends Number> outputType, Number value) {

        if(value == null) {
            return null;
        }
        if(Byte.class.equals(outputType)) {
           return value.byteValue(); 
        }
        if(Short.class.equals(outputType)) {
            return value.shortValue(); 
        }
        if(Integer.class.equals(outputType)) {
            return value.intValue(); 
        }
        if(Long.class.equals(outputType)) {
            return value.longValue(); 
        }
        if(Float.class.equals(outputType)) {
            return value.floatValue(); 
        }
        if(Double.class.equals(outputType)) {
            return value.doubleValue(); 
        }

        throw new TypeMismatchException();

    }

答案 2 :(得分:1)

如果你想将演员从调用者传递给类,那么重载setIntValue()

setIntValue(long l) {
  this.intValue = (int) l;
}

但是,既然你正在隐藏呼叫者的缩小范围,请确保在所有情况下这都是正确的。