【问题标题】:Java - Casting an Object to a ByteArrayEntity (Android) ClassCastExceptionJava - 将对象转换为 ByteArrayEntity (Android) ClassCastException
【发布时间】:2011-03-25 15:24:11
【问题描述】:

我有一个 ByteArrayEntity 如下:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
tempPic.compress(CompressFormat.PNG, 0, bos);
byte[] bitmapdata = bos.toByteArray();
photoByteArray = new ByteArrayEntity(bitmapdata);

tempPic 的类型为 android.graphics.Bitmap

然后我要做的是使用 AsyncTask 发出请求,该请求接受 Objects 的数组,然后我将其转换为它们的各种类型。但是,稍后在尝试投射我的 ByteArrayEntity 时,我得到了一个ClassCastException,我想知道是否有人可以解释这个?

protected HttpResponse doInBackground(Object... httpRequest) 
{
    ByteArrayEntity dataPhoto = null;

    // Further code


    if(myCondition)
    {
        dataPhoto = (ByteArrayEntity)httpRequest[2];
    }

}

我真的需要让它工作,但目前真的没有时间完全重新实现它,所以任何黑客或变通方法都将不胜感激。我正在使用 Android 2.2

整个目标是从 Android 相机拍摄图像,然后将我的 HttpRequestsetEntityByteArrayEntityPOST 我的图像到服务器,然后处理。

【问题讨论】:

  • 你 100% 确定 httpRequest[2] 是一个 ByteArrayEntity 吗?我认为没有任何关于任何特定类的东西可以阻止对其进行转换。
  • 我 100% 确定,我做了一个 httpRequest[2].getClass() 的 System.out.println,它输出“org.apache.http.entity.ByteArrayEntity”。这与我如何声明它有关吗?只是一个初始化为 null 的 ByteArrayEntity 类型的变量?我应该用空字节[]创建它的对象吗?

标签: android casting classcastexception


【解决方案1】:

与其传递Object[],然后根据数组中的位置进行强制转换,不如只传递一个bean?

public class MyBean {
    private ByteArrayEntity myByteArrayEntity;
    private String someString;

    // getters and setters
}

无需强制转换,更易于维护/扩展。

【讨论】:

  • 这将需要更多的重构,而不是在我的项目的这个阶段实际可行。我以后肯定会考虑这种方法,它是明智的。不过,关于为什么这个演员阵容失败有什么建议吗?真的很奇怪。
  • @Tim 重构并不需要太多,我猜不到一个小时。它还可以解决您当前的问题,并防止将来出现类似问题。为了了解您当前代码失败的原因,我们必须查看您曾经在数组中设置对象的所有代码。我猜你在某个时候得到了错误的索引。但正如我所说,调试对象数组比调试 bean 要困难得多。咬紧牙关进行重构会好得多。请记住先将版本保存到源代码管理!
  • 我仍然完全不知道为什么铸造不起作用。我会用这种方式...有一个长周末在我前面。我在进行这个项目时学到了很多东西,很遗憾我最初没有想到这些概念。谢谢。
  • 不错的收获。我没有意识到他试图传递不同类型的多个值。
【解决方案2】:

您可以使用 AsyncTask 的不同类型参数化,这样您就不需要强制转换。如果您使用的是匿名类,那么:

new ArrayTask<ByteArrayEntity, Void, HttpResponse>() {
    ...

这样你就可以做到:

@Override
protected HttpResponse doInBackground(ByteArrayEntity... byteArrays) {
    ...
    dataPhoto = byteArrays[2];
    ...

如果您的论点确实是ByteArrayEntity 类型。

【讨论】:

  • 这行得通,但我现在的调用需要一个对象数组,因为当我调用时,我传递了一些字符串和实体和映射,然后根据它们的位置投射它们在数组中。所有这些都可以工作(字符串和映射),但 ByteArrayEntity 不会强制转换 - 有什么想法吗?
  • 哎呀。在这种情况下,你真的需要按照 dave.c 所说的去做。你应该依赖 java 类型系统。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2017-04-29
  • 2012-08-01
  • 2012-08-29
相关资源
最近更新 更多