2014-02-15 55 views
-1

我需要將值Map<String, String>類型傳遞給Android的AsyncTask。不幸的是AsyncTask的回調doInBackground(Params... params)execute(Params... params)方法接受可變參數。我們知道可變參數變成了數組,我們不能創建泛型類型的數組。我如何將我的參數傳遞給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]

相關問題