2013-08-16 2 views
0

읽음 유효 자바 가능한 경우 반환 유형으로 인터페이스 사용을 강조합니다. 논쟁을 확장하면서 나는 다음과 같은 방법들 중 어느 것이 좋은 관행으로 간주 되었는가 궁금했다.형식 인수에 대해 인터페이스를 사용해야합니까?

옵션 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>()); 
} 
+1

메소드에서지도를 반환하면 인터페이스 선호 규칙이 계속 적용됩니다. – Kayaman

+2

글쎄, 두 번째 컴파일하지 않습니다 ... –

+0

전 더 일반적이므로 그렇게하지 않는 좋은 이유가 없다면, 나는 그 접근 방식을 선호합니다. – assylias

답변

2

은 확실히 옵션 1을 사용한다. Map<Integer, HashSet<Integer>>Map<Integer, Set<Integer>>이 아니기 때문에 옵션 2가 컴파일되지 않습니다.

0

일반적으로 인터페이스 사용자가 특정 구현을 사용하도록하는 구체적인 이유가없는 한 유형 인수에 대한 인터페이스를 선호합니다.

이 경우 map을 반환한다고 가정하면 할당시지도의 값이 Map<Integer, Set<Integer>> map으로 변환됩니다.

편집 : Java가 공변 유형 매개 변수를 지원하지 않으므로 java에서는 작동하지 않는다는 것을 제외하면 Map<Integer, HashSet<Integer>>은`Map>이 아닙니다. 그러나 그것은 스칼라에서 작동 할 것입니다.)

0

옵션 1은 다른 사람들이 지적한 오류를 가정 할 때보다 일반적인 옵션입니다.

이 유형의 프로그래밍은 일반적으로 모든 유형의 세트에 사용할 수 있으므로 더 유용한 버전입니다. 다른 설정 유형을 사용하는 경우이 방법으로 상기 코드의 다중 버전을 작성할 필요가 없습니다.

관련 문제