TL;DR:如何正确使用Firebase DataSnapshot.getValue()与通用类?
用例:我想使用Firebase实现一个单一的通用远程数据源类来处理所有实体(它们有很多)。当监听数据变化时,我想将datasnapshot的值作为类型为E的对象获取(其类型在其他地方确定),但我不知道是否可以使用Firebase查询来实现,如下所示:
public class GenRemoteDataSource<E extends SomeClass>
{
//...
public void onDataChange(DataSnapshot dataSnapshot)
{
E item = (E) dataSnapshot.getValue(); // <- unchecked cast and it doesn't work
items.add(item);
}
}
例如,我有一个扩展了SomeClass的Foo类,使用Foo类实现这个GenRemoteDataSource的方式如下:
public class Foo extends SomeClass{}
public class FooRemoteDataSource extends GenRemoteDataSource<Foo>
{
//...
}
但是 Firebase 报了一个运行时错误,因为它会尝试将 getValue() 强制转换为 Foo,而实际上它会将 value 强制转换为上限 SomeClass。我很困惑为什么会发生这种情况:
Java.lang.ClassCastException: java.util.HashMap cannot be cast to com.example.app.SomeClass
请指导我如何实现类型安全(无未经检查的转换)。谢谢。
编辑:下面的东西被证明是不相关的,请参见GenericTypeIndicator 删除线: 编辑:我还尝试过(盲目尝试,但值得一试)GenericTypeIndicator,
GenericTypeIndicator<E> mTypeIndicator = new GenericTypeIndicator<>();
E item = dataSnapshot.getValue(mTypeIndicator);
但它却返回以下的运行时错误。
com.google.firebase.database.DatabaseException: Not a direct subclass of GenericTypeIndicator: class java.lang.Object