2012-08-17 4 views
2

특정 캐시를 검색 할 수있는 함수를 작성했습니다. 이렇게하면 나는 그것을 던질 필요가 없습니다.Java - 목록이있는 Generic

@SuppressWarnings("unchecked") 
    public static <T> T inCache(Class<T> obj, String token) { 

     Object cacheObj = Cache.get(token); 
     if (cacheObj != null) { 

      if (obj.isAssignableFrom(cacheObj.getClass())) { 
       return (T) cacheObj; 
      } 
     } 
     return null; 

    } 

나는이

String s = inCache(String.class, title); 

처럼 사용하고 있습니다하지만 지금은 내 캐시에 문자열의 목록을 가지고 있고이 문제는이

List<String> ipList = Util.inCache(List<String>.class, title); 

처럼 사용할 수 없습니다 List<String>.class. 나는 자바에 대해 아주 처음이다. 어떻게 작성해야 하는가?

+1

보조 노트와 같은, 당신은 suppresswarnings이 사용''대신 (cacheObj를) obj.cast 반환하는 것이 필요하지 않습니다. – jtahlborn

답변

4

당신은 List<String>의 클래스를 얻을 수없는, 귀하의 경우 유일한 방법은 다음과 같습니다

List<String> ipList = Util.inCache(List.class, title); 
+0

과 불가피한 SuppressWarnings이 있습니다. – jtahlborn

6

Java에는 유형 삭제라는 개념이 있습니다. 기존의 이유로 인해 List와 같은 것은 단지 목록에 불과합니다. 그것은 런타임에 문자열의 목록임을 기억하지 않습니다. List.class 만 작성하면됩니다.

그런 다음 반복 할 때 목록의 개체 유형을 지정할 수 있습니다.

1

당신이 시도 할 수 너는 할 수있다 -

List<String> inList = Test.inCache((Class<? extends List<String>>)List.class, token); 
1

이 this-

List<String> inList = (List<String>)Test.inCache(List.class, title); 

을 시도 :

List<String> ipList = (List<String>)Util.inCache(List.class, title); 
1

Joe의 대답을 명확히하기 위해 (나는 충분한 평판을 얻지 못했습니다.) List <String>List<Integer> 또는 기타 유형 List 사이에는 아무런 차이가 없습니다. 실행시 제네릭이 보관되지 않습니다.

의미, List<String>.classList<Integer>.class과 완전히 동일하며 실제로는 List.class입니다. 이것은 Java 유형 시스템의 약점입니다. 나는 당신이 원하는 것을 구현하는 간단한 방법에 익숙하지 않다.

그것의 지옥에 대한 코드의 증거 :

// It is true that  
    List<String> stringList = new ArrayList<String>(); 
    List<Integer> integerList = new ArrayList<Integer>();            
    System.out.println(stringList.getClass() == integerList.getClass() ); 

    // And that ... 
    List objectList = new ArrayList(); 
    System.out.println(stringList.getClass() == objectList.getClass() ); 

    //However, the following is false because a different implementation is used (I wanted a false case) 
    List objectLinkedList = new LinkedList(); 
    System.out.println( objectLinkedList.getClass() == objectList.getClass());