来自 Effective Java Item 26 Favor Generic types
在所有其他条件相同的情况下,将未经检查的强制转换抑制为数组类型比标量类型风险更大,这将建议第二种解决方案。但是在比 Stack 更现实的泛型类中,您可能会在代码中的许多点从数组中读取,因此选择第二种解决方案需要多次转换为 E 而不是一次转换为 E[],这就是为什么第一种解决方案更常用 [Naftalin07, 6.7]。
作者scalar type
在这里是什么意思,他想在这里表达什么?什么选项 1 被认为比选项 2 更危险?
编码 :
// The elements array will contain only E instances from push(E).
// This is sufficient to ensure type safety, but the runtime
// type of the array won't be E[]; it will always be Object[]!
@SuppressWarnings("unchecked")
public Stack() {
elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
}
VS
// Appropriate suppression of unchecked warning
public E pop() {
if (size == 0)
throw new EmptyStackException();
// push requires elements to be of type E, so cast is correct
@SuppressWarnings("unchecked") E result =
(E) elements[--size];
elements[size] = null; // Eliminate obsolete reference
return result;
}