【问题标题】:What's a proper way to pass ArrayList<int[]>[] in an intent?在意图中传递 ArrayList<int[]>[] 的正确方法是什么?
【发布时间】:2014-12-29 04:52:17
【问题描述】:

我有这个收藏

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

【问题讨论】:

  • 您对此有无可辩驳的证据吗?因为类转换异常似乎是在说 ArrayList[] 已通过 Java 序列化/反序列化变成了 Object[],并且没有通过证据“气味测试”。

标签: java android android-intent arraylist


【解决方案1】:

设置ArrayList&lt;int[]&gt;[]:

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

现在,在接收 Activity 上,您可以通过以下方式重建它:

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&lt;int[]&gt; 的输入实际上并不存在在运行时,它本质上是一种syntactic sugar

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

显然,如果您可以控制这些对象的创建,则可能有更简洁的方法可以在您的应用程序中传递这些数据。例如,您可以只使用包含ArrayList&lt;int&gt;ArrayList 而不是ArrayList&lt;int[]&gt;[]

【讨论】:

  • 尽管我已经弄清楚了,如我之前的编辑中所示,但我接受您的回答,因为它指向了额外的信息。谢谢!
【解决方案2】:
intent.putIntegerArrayListExtra("int", int);

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

【讨论】:

  • 嗨。考虑到它是一个 ArrayList 的数组,它的内容是整数数组而不是整数,这是否可行?
【解决方案3】:

我建议这样做

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

如果 ArrayList[] 未被识别为可序列化。

【讨论】:

  • 嗨!可悲的是,当我尝试将 getSerializableExtra 的返回值转换为 (ArrayList[]) 时,将数组转换为可序列化仍然会引发相同的异常。我知道将数组写入 OutputObjectStream,将其内容作为 ByteArray 额外传递,然后转换从此 ByteArray 创建的 InputObjectStream 的 readObject 的返回值。但我认为必须有一种更简单或更合适的方法来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多