2014-03-05 86 views
4

我有一些像這樣的代碼:這是原始類型分配類型安全嗎?列表<T> = new ArrayList();

@SuppressWarnings({"unchecked", "rawtypes"}) 
List<String> theList = new ArrayList(); 

這是類型安全的?我認爲這是安全的,因爲我不把原始類型分配給其他任何東西。我甚至可以證明其進行類型檢查,當我打電話add

theList.add(601); // compilation error 

我已閱讀"What is a raw type and why shouldn't we use it?",但我不認爲它適用於這裏,因爲我只創建列表與原始類型。之後,我將其分配給參數化類型,那麼會出現什麼問題?

另外,這是怎麼回事?

@SuppressWarnings({"unchecked", "rawtypes"}) 
List<String> anotherList = new ArrayList(theList); 
+1

第二個是危險的,因爲'theList'中沒有什麼限制。 –

回答

10

首先是類型安全的,因爲該列表是空的,但仍然不建議。這裏沒有使用原始類型的好處。更好地設計遠離警告而不是壓制它。

第二絕對是類型安全的,因爲theList可能是一個List<Integer>例如:

import java.util.*; 

public class Test { 

    public static void main(String[] args) throws Exception { 
     List<Integer> integers = new ArrayList<>(); 
     integers.add(0); 

     List<String> strings = new ArrayList(integers); 
     // Bang! 
     String x = strings.get(0); 
    } 
} 

注意的構造本身怎麼叫沒有一個例外 - 有沒有辦法爲它知道是什麼那種名單你真的試圖構建,所以它不執行任何演員。但是,如果您接着一個值,則隱式轉換爲String,您將得到ClassCastException

+0

*「在這裏使用原始類型沒有任何好處。」*如果通用參數類很長,我不能使用鑽石? ; ) – Radiodef

+1

@Radiodef:然後使用Guava和'Lists.newArrayList',或者等價的:) –

+0

只是好奇,你有沒有見過這個問題?我以前想過這樣做,但它基本上看起來像一個滑坡。前面提到的其實並不是很重要的一點。 – Radiodef

相關問題