我有一些像這樣的代碼:結合Java泛型和反思,以避免鑄造
Object doMethod(Method m, Object... args) throws Exception {
Object obj = m.getDeclaringClass().getConstructor().newInstance();
return m.invoke(obj, args);
}
我用的是稍微複雜的代碼,但是這是它的想法。調用doMethod
我這樣做:
Method m = MyClass.class.getMethod("myMethod", String.class);
String result = (String)doMethod(m, "Hello");
這對我來說很好(可變數量的參數和所有)。 令我感到厭煩的是在調用者中對String
的必要演員。由於myMethod
宣佈,它返回一個String
,我想doMethod
足夠聰明,改變它的返回類型也String
。有沒有使用Java泛型來完成這樣的事情的方法?
String result = doMethod(m, "Hello");
int result2 = doMethod(m2, "other", "args");
在第一個示例中,使用'returnType.cast(...)'而不是未經檢查的轉換來使其類型安全。 – mihi 2011-05-06 18:45:34
+1第二個例子比較可怕,但很有趣。我將類型推斷添加到我的Java願望清單中。 – 2011-05-06 19:07:18
這不會使它編譯時間類型安全,它只是隱藏編譯器警告。如果方法的返回類型與您傳入的方法不匹配,它仍將在運行時拋出ClassCastException。 – Affe 2011-05-06 23:29:34