0

可能な場合はインターフェイスを戻り値の型として使用することを強調する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>());
}
4

3 に答える 3

2

間違いなくオプション 1 を使用する必要があります。Map<Integer, HashSet<Integer>>a は aではないため、オプション 2 はコンパイルされませんMap<Integer, Set<Integer>>

于 2013-08-16T20:26:19.917 に答える
0

はい、インターフェイスのユーザーに特定の実装を使用するように強制する特定の理由がない限り、通常は型引数のインターフェイスを好みます。

この場合、 を返すと仮定すると、 map の値が代入 mapでキャストされます。Map<Integer, Set<Integer>> map

編集:Javaでは共変型パラメーターがサポートされていないため、Javaでは機能しないことを除いてMap<Integer, HashSet<Integer>>、`Map>ではありません。しかし、それは Scala で動作します ;)

于 2013-08-16T20:28:42.450 に答える