在意图中传递 ArrayList<int[]>[] 的正确方法是什么?



我有这个集合

ArrayList<int[]>[] myList;

即整数数组的ArrayList的数组。我正试图通过一个意图。

intent.putExtra(getString(R.string.app_name) + ".myList", myList);

在新的活动中,我试图获得额外的作为:

ArrayList<int[]>[] myList;
Intent intent = getIntent();
myList = (ArrayList<int[]>[]) intent.getSerializableExtra(getString(R.string.app_name) + ".myList");

然而,我在这一行中得到了一个类强制转换异常。

Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.util.ArrayList[]

由于它们包含基元类型的数组,而ArrayList本身就是一个可序列化的类,我不知道为什么这不起作用,也不知道什么是更好的方法。

编辑

看来不能只将Object[]强制转换为CustomClass[]

检查:

快速Java问题:将一个对象数组投射到我想要的类的数组中

将对象数组转换为整数数组错误

因此,一种解决方案是

Object[] tmp = (Object[]) intent.getSerializableExtra(getString(R.string.app_name) + ".myList");
myList = Arrays.copyOf(tmp, tmp.length, ArrayList[].class);

或者,可以传递并检索ArrayList

// Calling Activity
ArrayList<ArrayList<int[]>> myIntentList = new ArrayList(Arrays.asList(myList));
intent.putExtra(getString(R.string.app_name) + ".myList", myIntentList);
// Called Activity
ArrayList<ArrayList<int[]>> myIntentList;
myIntentList = ArrayList<ArrayList<int[]>> intent.getSerializableExtra(getString(R.string.app_name) + ".myList");

设置ArrayList<int[]>[]:

int[] values1 = new int[] { 1, 2, 3 ,4 };
ArrayList<int[]> al1 = new ArrayList<int[]>();
al1.add(values1);
int[] values2 = new int[] { 1, 2, 3 ,4 };
ArrayList<int[]> al2 = new ArrayList<int[]>();
al2.add(values2);
ArrayList<int[]>[] arrayOfIntArrays = new ArrayList[] { al1, al2 };
Intent i = new Intent(this, DemoActivity.class);
i.putExtra("blah", arrayOfIntArrays);

现在,在接收活动中,以下是如何重建:

Object[] objArray = (Object[]) getIntent().getExtras().getSerializable("blah");
List<?> objList = Arrays.asList(objArray);
ArrayList<int[]>[] arrayOfLists = new ArrayList[objList.size()];
arrayOfLists = objList.toArray(arrayOfLists);
// example value extraction
int[] values1 = arrayOfLists[0].get(0);

至于为什么你必须这么做?这里有几个比较高级的Java概念。

第一个是int[]而不是基元。Java将任何Array视为Object

第二个是Java中的泛型要进行类型擦除。这意味着ArrayList<int[]>的类型在运行时并不真正存在,它本质上是一种语法糖。

您可能还想了解Java泛型中的协方差和逆变换。

显然,如果您可以控制这些对象的创建,那么在应用程序中传递这些数据可能会有更干净的方法。例如,您可以使用包含ArrayList<int>ArrayList来代替ArrayList<int[]>[]

intent.putIntegerArrayListExtra("int", int);

Bundle extras = getIntent().getExtras();
extras.getIntegerArrayList("int");

我建议进行

Serializable ser = (Serializable) list;
String key = getString(R.string.app_name) + ".myList";
intent.putExtra(key, ser);

以防ArrayList[]未被识别为Serializable。

最新更新