Java 将泛型类型参数传递给syncTask

Java 将泛型类型参数传递给syncTask,java,Java,我需要将Maptype的值传递给Android。不幸的是AsyncTask的回调doInBackground(Params…Params)和execute(Params…Params)方法接受varargs。我们知道varargs被转换成数组,我们不能创建泛型类型的数组。如何将参数传递给execute?泛型主要用于警告您在编译时做了不好的事情。 要使varargs与泛型一起运行,可以使用如下所示的包装器: import java.lang.reflect.Array; import java.u

我需要将
Map
type的值传递给Android。不幸的是
AsyncTask
的回调
doInBackground(Params…Params)
execute(Params…Params)
方法接受varargs。我们知道varargs被转换成数组,我们不能创建泛型类型的数组。如何将参数传递给
execute

泛型主要用于警告您在编译时做了不好的事情。 要使varargs与泛型一起运行,可以使用如下所示的包装器:

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();
    }
}
}
import java.lang.reflect.Array;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
公共类VarArgsGeneric{
公共静态void main(字符串…参数){
StringMapWrapper mw1=createMap(“1”,“一”);
StringMapWrapper mw2=createMap(“2”,“2”);
StringMapWrapper mw3=createMap(“3”,“三”);
VarArg测试=新的VarArg();
测试。添加(mw1、mw2、mw3);
test.add((StringMapWrapper)null);
StringMapWrapper[]mws=test.getParams(StringMapWrapper.class);
System.out.println(Arrays.toString(mws));
}
公共静态StringMapWrapper createMap(字符串键、字符串值){
StringMapWrapped=newStringMapWrapper(new HashMap());
mwrapped.getMap().put(键,值);
回击;
}
静态类VarArg{
private final List allParams=new ArrayList();
//堆污染:http://stackoverflow.com/q/12462079/3080094
@安全变量
公共最终作废添加(参数…参数){
用于(参数p:params){
所有参数加(p);
}
}
@抑制警告(“未选中”)
公共T[]getParams(类类型){
//抄袭http://stackoverflow.com/a/530289/3080094
final T[]pa=(T[])Array.newInstance(类型,allParams.size());
对于(int i=0;i
其中打印:

[{1=1},{2=2},{3=3},null]

你是说你尝试了
Map…
?是的,但是会抛出异常。什么样的异常?@sandahung哪些异常?我认为这是你应该提出的问题。一些与国家有关的例外情况。异常可能是由非泛型数组的代码引起的,因为修改后代码正在运行。有人能解释为什么在IDE警告下允许这样做吗?