1、問題的代碼
public static void main(String[] args) {
List<String> object = (List<String>) getObject();
for (String s : object) {
System.out.println(s);
}
}
public static Object getObject(){
ArrayList<String> list = new ArrayList<>();
list.add("one");
list.add("two");
return list;
}
2、出現的問題
java中如果需要將一個object轉成list,大部分人會直接使用強制類型轉換:(List<String>) obj
這樣。這樣強制轉換編譯會提示Unchecked cast: 'java.lang.Object' to 'java.util.List<java.lang.String>'
,編譯器的意思該強制類型轉換並未做類型校驗,強制轉換並不安全,可能會拋出異常導致程序崩潰。
問題的代碼:
將提示展開后:
Unchecked cast: 'java.lang.Object' to 'java.util.List<java.lang.String>' less... (Ctrl+F1)
Signals places where an unchecked warning is issued by the compiler, for example:
void f(HashMap map) {
map.put("key", "value");
}
Hint: Pass -Xlint:unchecked to javac to get more details.
3、問題的解決
在很多博客中有人會建議用@SuppressWarnings("unchecked")
解決編譯器警告,這種方法是極為不妥的,因為它只是用來告訴編譯器忽略警告,而警告卻實實在在的存在。
方式一:使用@SuppressWarnings("unchecked")
忽略問題
簡介: java.lang.SuppressWarnings是J2SE5.0中標准的Annotation之一。可以標注在類、字段、方法、參數、構造方法,以及局部變量上。
作用: 告訴編譯器忽略指定的警告,不用在編譯完成后出現警告信息。
使用:
@SuppressWarnings(“unchecked”)
告訴編譯器忽略 unchecked 警告信息,如使用List,ArrayList等未進行參數化產生的警告信息。
@SuppressWarnings(“all”)
抑制所有類型的警告。
public static void main(String[] args) {
@SuppressWarnings("unchecked")
List<String> object = (List<String>) getObject();
for (String s : object) {
System.out.println(s);
}
}
方式二:正確的方式
public static void main(String[] args) {
Object object = getObject();
if (object instanceof ArrayList<?>) {
List<?> obj = (List<?>) object;
for (Object o : obj) {
System.out.println(String.class.cast(o));
}
}
方式三:將方式二封裝為工具類使用
使用工具類
public static void main(String[] args) {
Object obj = getObject();
List<String> arrys = castList(obj, String.class);
for (String once : arrys) {
System.out.println(once);
}
}
工具類
public static <T> List<T> castList(Object obj, Class<T> clazz)
{
List<T> result = new ArrayList<T>();
if(obj instanceof List<?>)
{
for (Object o : (List<?>) obj)
{
result.add(clazz.cast(o));
}
return result;
}
return null;
}