Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接口应该用于类型参数吗_Java_Effective Java - Fatal编程技术网

Java 接口应该用于类型参数吗

Java 接口应该用于类型参数吗,java,effective-java,Java,Effective Java,我读过有效的Java,它强调尽可能使用接口作为返回类型。扩展论点,我想知道以下哪种方法更可取/被认为是一种好的做法 备选案文1: Map<Integer, Set<Integer>> map = new HashMap<Integer, Set<Integer>>(); // Interface 'Set' declared in type for (int v = 0; v < graph.getNumberOfVertices();

我读过有效的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>());
 }
Map Map=newhashmap();//类型中声明的接口“Set”
对于(int v=0;v
备选案文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>());
}
Map Map=newhashmap();//类“HashSet”在类型中声明。
对于(int v=0;v
必须使用选项1。选项2不会编译,因为
映射
不是
映射

是的,通常更喜欢类型参数的接口,除非您有特定的原因强制接口的用户使用特定的实现

在这种情况下,假设您要返回
map
,则map的值将在赋值中转换为
map


编辑:但这不起作用,因为在java中,因为java不支持协变类型参数,所以
Map
不是“Map>”。但它在Scala中会起作用;)

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

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

如果要从方法返回映射,则接口首选规则仍然适用。第二个规则不可编译,但…前者更通用,除非您有充分的理由不这样做,我更喜欢这种方法。你也可以使用一个我认为可以安全地假设OP在第二段中的意思是
Map…