JAVA判定参数类型进行赋值_java – 为什么泛型方法在赋值中更改了参数化类型?...
在編寫處理表單數據的通用方法時,我遇到了以下(我認為)未完成的行為.給出以下代碼:
public class Test {
public void someGenericMethod(Integer a) {
@SuppressWarnings("unchecked")
T t = (T) a;
System.out.println(t);
System.out.println(t.getClass());
}
public static void main(String[] args) {
Test test = new Test();
test.someGenericMethod(42);
}
}
AFAIK,上面的代碼應該在行T t =(T)a中生成一個ClassCastException,因為main中的方法調用是將參數化類型設置為BigDecimal,并且不允許從Integer轉換為BigDecimal,相反,我所期望的程序執(zhí)行得很好并打印以下內容:
42
class java.lang.Integer
實際上,如果我在方法簽名中添加另一個參數(如String b)并再生成另一個賦值T t2 =(T)b,則程序打印
42
class java.lang.String
為什么t變量將它的類型改為Integer(在任何可能的情況下,對T類型的對象進行某種促銷)?
對此行為的任何解釋都是受歡迎的
解決方法:
(T)a是未經檢查的強制轉換:由于type erasure,運行時無法知道T是什么類型,因此它無法實際檢查是否屬于類型T.
執(zhí)行此操作時,編譯器會發(fā)出警告;在您的情況下,您通過編寫@SuppressWarnings(“未選中”)來抑制該警告.
編輯添加(以回應下面評論中的進一步問題):
如果你想檢查演員表,你可以這樣寫:
public class Test {
public void someGenericMethod(Class clazz, Integer a) {
T t = clazz.cast(a);
System.out.println(t);
System.out.println(t.getClass());
}
public static void main(String[] args) {
Test test = new Test();
// gives a ClassCastException at runtime:
test.someGenericMethod(BigDecimal.class, 42);
}
}
通過傳遞clazz,允許運行時檢查強制轉換;而且,更重要的是,您允許編譯器從方法參數中推斷出T,因此您不必再編寫測試.< BigDecimal> someGenericMethod.
當然,調用該方法的代碼仍然可以通過使用未經檢查的強制轉換來避免這種情況:
public static void main(String[] args) {
Test test = new Test();
Class clazz = Object.class;
test.someGenericMethod((Class) clazz, 42);
}
但那是主要的錯,而不是某些GenericMethod.
標簽:java,generics
來源: https://codeday.me/bug/20190529/1181833.html
總結
以上是生活随笔為你收集整理的JAVA判定参数类型进行赋值_java – 为什么泛型方法在赋值中更改了参数化类型?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis是什么_深入解析:Myba
- 下一篇: Go get 下载的包在哪里?