今天早上我醒来时遇到了这个奇怪的例外:
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太多次而对我有诅咒;)?
谢谢!
答案 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这个案例有更好的解决方案,我会很高兴听到它。