我有一個參數類型不匹配的問題,而我嘗試設置一個值,如使用硬節中的泛型所示。使用反射動態顯式轉換Java中的原始類型
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;
}
}
的事情是,我必須預見到明確的投?
編輯
是否有可能預見到基本收縮轉換可能發生,使用反射型類等動態的方式進行呢?
FYI:
當我們對原始反射類型的工作,他們不再是原始的。
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
一種實現這一方法是,將值更改爲字符串,然後使用特定類型的號碼字符串構造通過與值的字符串。
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.
你是什麼意思的「以通用的方式」?如果你沒有顯式的強制轉換,編譯器會正確地抱怨,因爲你試圖強制一個'long'變成'int'。你想要它做什麼? –
什麼是「invokeSet」?使用反射設置bean上的值的函數?你可以在你的問題更具體嗎? –
@Oli使用反射。我的錯誤。 @Luciano,是的,它是一個使用反射將值設置爲bean的函數。 –