我有这个集合
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。