我有这个集合
ArrayList<int[]>[] myList;
,即整数数组的ArrayLists数组。我试图以意图传递它。
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 []
检查:
Quick Java question: Casting an array of Objects into an array of my intended class
casting Object array to Integer array error
所以一个解决方案就是
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");
答案 0 :(得分:0)
intent.putIntegerArrayListExtra("int", int);
和
Bundle extras = getIntent().getExtras();
extras.getIntegerArrayList("int");
答案 1 :(得分:0)
我建议做
Serializable ser = (Serializable) list;
String key = getString(R.string.app_name) + ".myList";
intent.putExtra(key, ser);
如果ArrayList []未被识别为Serializable。
答案 2 :(得分:0)
设置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中的泛型受type erasure的约束。这意味着ArrayList<int[]>
的输入在运行时并不存在,它本质上是syntactic sugar。
您可能还想了解Java Generics中的协方差和逆变。
显然,如果您可以控制这些对象的创建,可能会有更简洁的方法在您的应用程序中传递此数据。例如,您可以使用包含ArrayList<int[]>[]
的{{1}}代替ArrayList
。