2014-09-01 59 views
-1

當我在方法中使用嵌套泛型時,有一個未經檢查的警告。這是爲什麼?什麼會導致嵌套泛型中未經檢查的警告?

package test; 

public class subc { 

    public static void main(String[] args) { 
     Integer aa[] = new Integer[10]; 
     infunction(aa); 
     // Not Warning , Use genericTest !!!!!!!!!!! 
     Integer[] abc = genericTest(aa, aa.getClass()); 
     @SuppressWarnings("unused") 
     Integer a = abc[0]; 
    } 

    public static <T> T[] genericTest(T[] aa, Class<? extends T[]> class1) { 
     return aa; 
    } 

    public static <T> T[] infunction(T[] aa) { 
     // Warning, Use genericTest(unchecked) !!!!!!!!!! 
     T[] result = (T[]) genericTest(aa, aa.getClass()); 
     return result; 
    } 
} 

如果我修改的方法,也沒有警告:

public static <T> T[] genericTest(T[] aa) { 
    return aa; 
} 

那麼,爲什麼我得到的第一個代碼塊的警告,而不是第二個?

+0

爲什麼'Class <?擴展T []>'?你可以說'Class '或者更好的'Class '(在你的'genericTest'方法中)。 (複製代碼) – 2014-09-01 08:51:01

+0

只是測試代碼,並且我複製了,Arrays.copyOf – 2014-09-01 09:10:20

+0

public static T [] copyOf(U [] original,int newLength,Class <?extends T []> newType) newType ==(Object)Object []。class) ? (T [])new Object [newLength] :(T [])Array.newInstance(newType.getComponentType(),newLength); System.arraycopy(original,0,copy,0, Math.min(original.length,newLength)); return copy; } 我只是改變簡單的情況 – 2014-09-01 09:10:55

回答

0

未檢查的轉換是您看到明確寫在代碼中的(T[])轉換。 T[]不是可確定的類型,因此在運行時不會對其進行強制檢查。

我猜你在沒有轉換的代碼沒有編譯時添加了轉換。所以真正的問題是爲什麼T[] result = genericTest(aa, aa.getClass());不能編譯。

這是因爲aa.getClass()返回類型Class<? extends Object[]>.getClass()方法的實際編譯時返回類型(如其文檔中所述)爲Class<? extends |X|>,其中|X|是表達式.getClass()被調用的靜態類型的擦除。這裏,aa具有類型T[],其擦除爲Object[],所以aa.getClass()返回類型Class<? extends Object[]>。 (原因爲.getClass()返回類型,我不會在這裏贅述了。)

由於genericTest的第二個參數的類型是Class<? extends T[]>(在genericTest方面的T)和aa.getClass()的類型爲Class<? extends Object[]>,爲唯一有效的選擇T在呼叫genericTest(aa, aa.getClass())TObject。因此,genericTest(aa, aa.getClass())返回類型Object[],它不能被分配到T[]

相關問題