2014-02-15 3 views
-1

Map<String, String> 유형의 값을 Android의 AsyncTask에 전달해야합니다. 유감스럽게도 AsyncTask의 콜백 doInBackground(Params... params)execute(Params... params) 메서드는 varargs를 허용합니다. varargs가 배열로 바뀌고 generic 형식의 배열을 만들 수 없다는 것을 알고 있습니다. 매개 변수를 execute에 전달하려면 어떻게해야합니까?일반 유형 매개 변수를 syncTask에 전달하십시오.

+0

을 당신은'지도 <문자열, 문자열> 시도했습니다 말을하는지. ..'? –

+0

예하지만 예외가 발생합니다. –

+3

어떤 종류의 예외입니까? –

답변

1

제네릭은 컴파일시에 나쁜 일을하는 것에 대해 경고하기 위해 주로 사용됩니다. 아래 그림과 같이 는 제네릭가는과 가변 인자, 당신은 래퍼를 사용하여 효율적으로 활용하려면 다음

import java.lang.reflect.Array; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class VarArgsGeneric { 

public static void main(String... args) { 

    StringMapWrapper mw1 = createMap("1", "one"); 
    StringMapWrapper mw2 = createMap("2", "two"); 
    StringMapWrapper mw3 = createMap("3", "three"); 

    VarArg<StringMapWrapper> test = new VarArg<StringMapWrapper>(); 
    test.add(mw1, mw2, mw3); 
    test.add((StringMapWrapper)null); 
    StringMapWrapper[] mws = test.getParams(StringMapWrapper.class); 

    System.out.println(Arrays.toString(mws)); 
} 

public static StringMapWrapper createMap(String key, String value) { 

    StringMapWrapper mwrapped = new StringMapWrapper(new HashMap<String, String>()); 
    mwrapped.getMap().put(key, value); 
    return mwrapped; 
} 

static class VarArg<Param> { 

    private final List<Param> allParams = new ArrayList<Param>(); 

    // Heap pollution: http://stackoverflow.com/q/12462079/3080094 
    @SafeVarargs 
    public final void add(Param... params) { 

     for (Param p : params) { 
      allParams.add(p); 
     } 
    } 

    @SuppressWarnings("unchecked") 
    public <T> T[] getParams(Class<T> type) { 

     // Copied from http://stackoverflow.com/a/530289/3080094 
     final T[] pa = (T[]) Array.newInstance(type, allParams.size()); 
     for (int i = 0; i < pa.length; i ++) { 
      pa[i] = type.cast(allParams.get(i)); 
     } 
     return pa; 
    } 
} 

static class StringMapWrapper { 

    private final Map<String, String> m; 

    public StringMapWrapper(Map<String, String> m) { 
     this.m = m; 
    } 

    public Map<String, String> getMap() { 
     return m; 
    } 

    @Override 
    public String toString() { 
     return m.toString(); 
    } 
} 
} 

인쇄 어느 :
[{1=one}, {2=two}, {3=three}, null]

관련 문제