2014-02-15 3 views
-1

Мне нужно передать значение Map<String, String> на Android-плеер AsyncTask. К сожалению AsyncTask обратный вызов doInBackground(Params... params) и execute(Params... params) метод принимает varargs. Мы знаем, что varargs превращается в массивы, и мы не можем создавать массивы родовых типов. Как передать свой параметр execute?Передайте общие параметры типа syncTask

+0

Вы хотите сказать, что вы уже пробовали 'Map . ..'? –

+0

Да, но исключены исключения. –

+3

Какие исключения? –

ответ

1

Generics просто в основном там, чтобы предупредить вас о том, как делать плохие вещи во время компиляции. Чтобы получить дженериков переменные аргументы происходит, вы можете использовать обертку, как показано ниже:

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]

Смежные вопросы