項目23(不要使用新代碼的原始類型)有效的Java中聲稱,在Java代碼中使用原始類型總是危險原始類型總是不好?
例如,它聲稱,下面的方法是危險和不安全
// Use of raw type for unknown element type - don't do this!
static int numElementsInCommon(Set s1, Set s2) {
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
儘管我可以看到在s1和s2上執行任何類型的寫操作或類轉換操作都會導致各種異常,但我不明白爲什麼上述方法不安全。作者Joshua Bloch繼續推薦以下方法。
// Unbounded wildcard type - typesafe and flexible
static int numElementsInCommon(Set<?> s1, Set<?> s2){
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
換句話說,如果一個方法只使用Object.Class的方法和沒有做任何修改所傳遞的參數,爲什麼這樣做不好?
在很久以前,在泛型之前,人們會在當天的集合中混合**類型(即'Hashtable'和'Vector',它們不是那些日子裏的集合)。這導致了諸如'[0,「abc」,Date]'這樣的事情,因爲Java允許你創建自己的數據類型。使用'Set >',您可以保證一致的元素類型。 –
當然。我的問題是,原始類型不安全的情況下,只讀方法或操作只涉及暴露的方法** Object.Class ** –
不,它們不是。在運行時,所有類型都是原始的,並且它們與推薦的通配符方法完全相同。但是這種方法會讓編譯器檢查你實際上沒有做這些「安全的事情」。如果沒有通配符,如果您不小心將其添加到您的套件中,則不會收到錯誤消息。因此,如果您知道它,請使用通用類型;如果不知道,請使用通配符。不要使用原始類型。 – Thilo