2011-03-12 2 views
0

하나의 인터페이스 IMyInterface가 있습니다. 이 인터페이스를 구현하는 클래스 집합 : Class1, Class2 ...자바 - 값으로 인터페이스가있는 Hashtable 사용

이제 IMyInterface를 구현하는 모든 클래스를 저장하는 Hashtable을 만들고 싶습니다.

Hashtable<String,? extends IMyInterface> ht = new Hashtable<String,? extends IMyInterface>(); 
ht.add("foo",new Class1()); 

컴파일러는 HT를 instiate 수없는 및 추가 메소드는 그렇게하도록 설정되어 있지 않기 때문에이 클래스 1을 추가 할 수 없습니다 뿌려줍니다. 메서드 추가 예상 : IMyInterface : \

어떻게하면됩니까?

답변

2

는 간단하게 사용

Hashtable<String, IMyInterface> table = new Hashtable<String, IMyInterface>(); 
table.put("foo", new Class1()); 

Class1IMyInterface를 구현 감안할.

+0

답장을 보내 주셔서 감사합니다;) 추가 대신 put을 사용해야했습니다! – Stephan

0

당신이 쓴 유형, Hashtable<String,? extends IMyInterface>IMyInterface의 일부 하위 유형의 요소를 값으로 저장 해시 테이블을 의미하지만, 우리는 어느 모르겠어요. 이는 가변 유형에 적합하며 컴파일러가 올바른 부속 유형을 사용하고 있는지 확신 할 수 없기 때문에 키를 추가 할 수는 없지만 생성자 호출에는 사용할 수 없습니다.

원하는 것은 Hashtable<String, IMyInterface>입니다. 즉, 은 IMyInterface를 구현하는 모든 개체을 의미 할 수 있습니다.

그런데 Hashtable 대신에 변수에 Map<String, IMyInterface>을 사용하고 생성자에 HashMap<String, IMyInterface>을 사용하는 것이 좋습니다.

+0

왜 hashmap이 hashtable보다 나은가요? 해시 테이블에 동시 액세스가 필요합니다. – Stephan

+0

나는'Map'을 사용하는 것에 동의하지 않습니다. 이 코드 라인은 공개 API가 아닌 구현 세부 사항입니다. 캡슐화와 추상화가 필요 없으며 블랙 박스가 아닙니다. 여기서 인터페이스를 사용하지 말고 정확한 유형을 사용하십시오. – irreputable

+0

HashMap과 Hashtable에 대하여 : 종종 외부 동기화를 사용하는 것이 좋습니다. 왜냐하면 빌드 - 인 동기화가 도움이되지 않는 해시 테이블보다 다른 변수에 액세스하고 있기 때문입니다. 또한, Hashtable은 혼란을 일으키는 새로운 맵에 추가적으로 오래된 메소드 이름을 가지고 있습니다. 하지만 원하는대로 해보십시오. 여기서 중요한 것은 아닙니다. 최악의 경우에는 불필요한 동기화를 수행해야합니다. –