原始类型总是不好吗?

时间:2016-05-30 02:32:06

标签: java effective-java

有效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 的方法,并且不对传递的参数进行任何修改,为什么它不好?

1 个答案:

答案 0 :(得分:2)

从某种意义上说,它会阻止编译器对更多代码进行类型检查。

当然,如果没有它,你可以编写好的和安全的代码。人们每天都在使用Perl和Javascript。即使在Java中,使用原始类型和在运行时使用类型集合 也没有区别。但是,对于尽可能多地为您进行编译检查,还有一些事情可以说。

因此,使用类似示例的方法,使用通配符类型(Set<?>)而不是原始类型。这样,如果你写了'#34;危险&#34;代码如s1.addAll(s2);,编译器会对你大喊大叫。