2012-10-28 3 views
3

지도를 쉽게 작성하려면 MapBuilder을 구현하십시오. 하지만 HashMap.class의 인스턴스를 가져 오려고하면이 인스턴스를 가져 오기 위해 HashMap.class를 사용할 수 없습니다. .일반 매개 변수화 된 클래스를 인스턴스화하는 방법

불법입니다!

그래서 아무도 왜이 문제를 해결할 수 있는지 말해 줄 수 있습니까?

import java.util.Map; 

public abstract class MapBuilder { 

    public static <K, V, T extends Map<K, V>> InnerMapBuilder<T, K, V> start(
      Class<T> clazz) { 
     return new InnerMapBuilder<>(clazz); 
    } 

    public static class InnerMapBuilder<T extends Map<K, V>, K, V> { 

     private T target; 

     public InnerMapBuilder(Class<T> clazz) { 
      try { 
       target = clazz.newInstance(); 
      } catch (InstantiationException | IllegalAccessException e) { 
       throw new RuntimeException(e); 
      } 
     } 

     public InnerMapBuilder<T, K, V> put(K key, V val) { 
      target.put(key, val); 
      return this; 
     } 

     public T get() { 
      return target; 
     } 
    } 
} 

을 그리고 테스트 코드는 다음과 같습니다 :

start 이후
public static void main(String[] args) { 
    HashMap<String, String> v = start(HashMap<String,String>.class).put("a", "b").get(); 
    System.out.println(v); 
} 

답변

1

그것은 Reimeus로, 일반적인 유형의 매개 변수 클래스 타입 변수를 얻기 위해 불가능 고 밝혔다. 그래서 세 가지 선택이 있습니다.

첫째, 당신은 체크되지 않은 캐스트 살 수 :

Class<? extends Map<String, Integer>> clazz = 
    (Class<? extends Map<String, Integer>>) HashMap.class; 

둘째, 당신은 (익명의 내부 클래스를 사용하여,이 예에서)를 확장하여 클래스 매개 변수를 구체화 할 수 있습니다

Class<? extends Map<String, Integer>> clazz = 
    new HashMap<String, Integer>() {}.getClass(); 

start() 대신 클래스 대신 Map 인스턴스를 사용하십시오. Map의 인스턴스가 아닌 Class을 사용하여 작업을 저장하지 않고 인스턴스를 만드는 것이 가장 먼저해야 할 일입니다.

를 전달하여, 사용자도 맵의 설정을 조정할 수 있습니다 (예를 들어, HashMap를 들어 TreeMap를 들어, 부하 계수를 설정하십시오 Comparator 지정) 그래서 어쨌든 더 나은 대안이다. 필요한 경우 전달할 때 비어 있다고 주장 할 수 있습니다.

팩토리가 실제로 필요한 경우 Class을 사용하지 마십시오. 공장에서 작동하지 않기 때문에 유일한 방법입니다 Class이 생성하는 인스턴스를 사용자 정의 할 수 있습니다. 클래스를 서브 클래스 화하고 새로운 인수없는 생성자를 제공합니다. 방법이 T create() 인 인터페이스 Factory<T>을 만든 다음 Factory<? extends Map<K, V>을 수락하십시오.

+0

좋은 답변을 주셔서 감사합니다. 잠시 시간을내어 귀하의 단어에 대해 생각해 보겠습니다. – jackalope

+0

세 번째 해결 방법을 사용하여 해결되었습니다. – jackalope

0

먼저 HashMap.class로에게 이러한 unparameterized 클래스를 전달하는 당신이 가진 것 클래스를 취

는 MapBuilder 따를 수 있습니다. 당신이 제네릭 형식 Map을 반환하고 둘째, 당신은 또한 해당 지역의 유형 일을해야 할 것이다 이렇게 사용 :

Map<String, String> v = start(HashMap.class).put("a", "b").get(); 
+0

감사합니다.하지만이 형식이 안전하지 않아야하며 일부 일반 형식 경고가 표시됩니다. – jackalope

+0

예하지만 매개 변수화 된 클래스 형식 변수를 정의 할 수 없습니다. – Reimeus

관련 문제