Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在意图中传递ArrayList[]的正确方法是什么?_Java_Android_Android Intent_Arraylist - Fatal编程技术网

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

Java 在意图中传递ArrayList[]的正确方法是什么?,java,android,android-intent,arraylist,Java,Android,Android Intent,Arraylist,我有这个收藏 ArrayList<int[]>[] myList; 在新的活动中,我尝试获得额外的: ArrayList<int[]>[] myList; Intent intent = getIntent(); myList = (ArrayList<int[]>[]) intent.getSerializableExtra(getString(R.string.app_name) + ".myList"); 由于它们包含基元类型的数组,并且Array

我有这个收藏

ArrayList<int[]>[] myList;
在新的活动中,我尝试获得额外的:

ArrayList<int[]>[] myList;

Intent intent = getIntent();
myList = (ArrayList<int[]>[]) intent.getSerializableExtra(getString(R.string.app_name) + ".myList");
由于它们包含基元类型的数组,并且ArrayList本身是一个可序列化的类,我不知道为什么这样做不起作用,或者什么是更好的方法

编辑

似乎不能将对象[]强制转换为CustomClass[]

检查:

因此,一个解决方案是

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");

我建议这样做

Serializable ser = (Serializable) list;
String key = getString(R.string.app_name) + ".myList";
intent.putExtra(key, ser);
如果ArrayList[]未被识别为可序列化。

设置ArrayList[]:

现在,在接收活动中,您可以通过以下方式重建:

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将任何数组视为对象

第二个是Java中的泛型受限制。这意味着ArrayList的类型在运行时并不存在,它本质上是一种类型

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


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

您是否有确凿的证据?因为类强制转换异常似乎表示ArrayList[]已通过Java序列化/反序列化转换为Object[],并且未通过证据气味测试。您好!遗憾的是,当我尝试将getSerializableExtra的返回值强制转换为ArrayList[]时,将数组强制转换为serializable仍然会引发相同的异常。我知道将数组写入OutputObjectStream,将其内容作为ByteArray额外传递,然后强制转换由该ByteArray创建的InputObjectStream的readObject返回值。但我想一定有一个更简单或更合适的方法。考虑到它是一个ArrayList数组,其内容是整数数组,而不是整数数组,这行得通吗?尽管我已经在前面的编辑中找到了它,但我还是接受你的答案,因为它指向了额外的信息。非常感谢。
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);
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);