Java 接口应该用于类型参数吗
我读过有效的Java,它强调尽可能使用接口作为返回类型。扩展论点,我想知道以下哪种方法更可取/被认为是一种好的做法 备选案文1: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();
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…
。