android中无处不在的ClassCastException

时间:2013-12-10 15:17:16

标签: java android reflection ormlite

今天早上我醒来时遇到了这个奇怪的例外:

  

java.lang.ClassCastException:   org.apache.harmony.luni.lang.reflect.ImplForVariable无法强制转换为   java.lang.Class中

当我尝试获取Type参数Class时会发生这种情况。

示例:

public static Class getTypeParameterClass(Object o, int index) {
    return (Class)
            ((ParameterizedType)o.getClass()
                    .getGenericSuperclass())
                    .getActualTypeArguments()[index];
}

如您所见,此方法获取给定对象类的类型参数之一。

它已经工作了几个月,但今天它停止了。

用法示例:

Collection<Object> foo = new ArrayList<Object>();

Class<?> fooClass = Utils.getTypeParameterClass(foo, 0);

它崩溃了。

因为责备java太多次而对我有诅咒;)?

谢谢!

2 个答案:

答案 0 :(得分:1)

  

如您所见,此方法获取给定对象类的类型参数之一。

因此,由于泛型类型擦除,特别不允许您执行的操作。您正在尝试调查ArrayList的通用参数,但在代码运行时,特定的泛型类型将不再可见。

如果你正在处理一个超类,你的超级黑客(它是一个黑客)会起作用。如果您定义ArrayList喜欢:

,它会起作用
Collection<Object> foo = new ArrayList<Object>() {
    private static final long serialVersionUID = -594043150300376049L;
};

在这种情况下,foo扩展 ArraryList的类。出于某种原因,使用超类,泛型类型参数可用。

答案 1 :(得分:0)

所以,首先,让我耐心地向格雷致谢。

我终于弄明白了什么。

我专注于错误的领域。

因此,正如格雷指出的那样,由于类型擦除,你无法获得在编译时未明确给出的类型参数。

我非常被说服错误发生在Collection字段上,我完全忘记了其他字段。

所以,因为我的数据来自webservices,并且因为JSON映射器无法直接以root身份获取列表,所以我必须定义包含对象集合,日期(用于缓存)以及与之相关的其他一些内容的模型。寻呼。

所以,因为编写所有这些类似的类是无稽之谈,我试图概括这个过程,如下所示:

public abstract class ModelList<T> {

        [ paging and caching stuffs ]

        @ForeignCollectionField
        Collection<T> collection;

        [ constructor, getters, setters ]

}

然后只有类似的子类:

@DatabaseTable(tableName = "category_list")
public class CategoryList extends ModelList<Category> {

}

所以我可以使用较少的详细类,因此我可以使用Robospice的ObjectPersister来概括缓存过程。

我无法理解(因为缺乏知识),是在运行时找不到参数!

让我更加困惑的是,我试图重现错误的测试,WERE产生错误!但他们也错了。

所以,请注意自己(和其他可能像我一样面对完全废话的人):

  • 不要对语言失去信心(这不是马车,它不是马车,它不是马车......)
  • 不要责怪语言(不要太多)
  • 始终将来源附加到罐子并设置断点

最后,解决方案非常简单,只需将集合从ModelList移动​​到子类,并将getter和setter保留为ModelList中的抽象方法(对于通用ObjectPersisters)。

我认为这一切都有点过于复杂,如果有人知道使用ormlite / jackson / robospice这个案例有更好的解决方案,我会很高兴听到它。

相关问题