2013-02-01 39 views
2

在我最近的課堂作業,我們一直與仿製藥,我已經收到這樣的警告:未經檢查或不安全的操作功課

Note: Selector.java uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 

據我所知,從沒有指定對象的類型,這導致我的收藏。我目前正在使用int來進行測試,但該程序應該允許對任何類型對象進行排序。我不認爲我想要將我的集合指定爲int,並且由於這個原因,我的集合目前是T類型的。但是我的指示明確指出我的程序不應該產生任何警告。這裏是我的方法之一:

我現在擁有的一切:

 else { 
     T[] a = new T[c.size()]; 
     c.toArray(T[] a); 
     T min = a[0]; 
     for (int i = 0; i < a.size(); i++) { 
      if (comp.compare(min, a[i]) > 0) { 
       min = a[i]; 
      } 
     } 
     return min; 
    } 

什麼我越來越:

Testing.java:48: error: generic array creation 
      T[] a = c.toArray(new T[c.size()]); 
+3

那麼你嘗試服用編譯器的建議,看細節? –

+1

順便說一下,你真的*不想在這樣的循環內調用'toArray'。 (您可能還想考慮'Collection '擴展了'Iterable '......) –

+0

'Notice'不是'Warning':http://docs.oracle.com/cd/E12483_01/wlevs20/config_server /logging.html#wp1013043 – alfasin

回答

2

爲了擺脫的通知,你應該使用

Collection.toArray(T[] a) 

而不是

Collection.toArray() 

Collection.toArray()返回一個對象數組,因此您將始終需要投射。

另外,調用toArray的代價很高,因爲必須創建新的數組,因此您應該考慮將其存儲到變量中並重用。

遺憾的是無法創建泛型類型的數組,因此,我認爲你應該刪除指定者和使用迭代器來收集,例如:

Iterator<T> iterator = c.iterator(); 
T min = iterator.next(); //you already checked that there has to be first element 
while (iterator.hasNext()) { 
    T element = iterator.next(); 
    if (comp.compare(min, element) > 0) { 
     min = element; 
    } 
} 
return min; 
+0

究竟是(T [] a)對我意味着什麼?我通過API讀取並嘗試做出一些調整,但我想我完全清楚調用toArray()與toArray(T [] a)的結果之間的差異。 –

+0

T [] a,表示T類型的數組,方法toArray返回Object,因爲它必須向後兼容以前的版本,因此如果有人想要檢索類型T的數組,則創建第二個方法toArray(T [] a) 。正如javadoc中所描述的:T [] a是一個數組,這個集合的元素將被存儲在該數組中,如果它足夠大的話;否則,將爲此分配一個相同運行時類型的新數組 – zibi

+0

不幸的是,不可能創建一個泛型類型的數組...因此,我會建議在集合上使用迭代器 – zibi

相關問題