有效Java声明的项目23(不要在新代码中使用原始类型)在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 的方法,并且不对传递的参数进行任何修改,为什么它不好?
答案 0 :(得分:2)
从某种意义上说,它会阻止编译器对更多代码进行类型检查。
当然,如果没有它,你可以编写好的和安全的代码。人们每天都在使用Perl和Javascript。即使在Java中,使用原始类型和在运行时使用类型集合 也没有区别。但是,对于尽可能多地为您进行编译检查,还有一些事情可以说。
因此,使用类似示例的方法,使用通配符类型(Set<?>
)而不是原始类型。这样,如果你写了'#34;危险&#34;代码如s1.addAll(s2);
,编译器会对你大喊大叫。