接口应该用于类型参数

时间:2013-08-16 20:24:23

标签: java effective-java

我已阅读 Effective Java ,其中强调在可能的情况下使用接口作为返回类型。延伸这个论点我想知道以下哪种方法是首选/被认为是一种好的做法。

选项1:

 Map<Integer, Set<Integer>> map = new HashMap<Integer, Set<Integer>>(); // Interface 'Set' declared in type
 for (int v = 0; v < graph.getNumberOfVertices(); v++) {
     map.put(v, new HashSet<Integer>());
 }

选项2:

Map<Integer, Set<Integer>> map = new HashMap<Integer, HashSet<Integer>>(); // Class 'HashSet' declared in type.
for (int v = 0; v < graph.getNumberOfVertices(); v++) {
    map.put(v, new HashSet<Integer>());
}

3 个答案:

答案 0 :(得分:2)

绝对应该使用选项1。选项2将无法编译,因为Map<Integer, HashSet<Integer>>不是Map<Integer, Set<Integer>>

答案 1 :(得分:0)

是的,通常更喜欢类型参数的接口,除非您有特定的理由强迫接口的用户使用特定的实现。

在这种情况下,假设您要返回map,地图的值将转换为作业中的Map<Integer, Set<Integer>> map

编辑:除了因为在Java中不起作用,因为Java不支持协变类型参数,所以Map<Integer, HashSet<Integer>>不是`Map&gt;。但它可以在Scala中使用;)

答案 2 :(得分:0)

选项1是更通用的选项,假设其他人指出的错误。

这种类型的编程通常是更有用的版本,因为它可以用于所有类型的集合。 这样,如果使用不同的集合类型,则不必编写所述代码的多个版本。