作者:李树兴2502917897 | 来源:互联网 | 2023-02-10 12:05
当使用Kotlin与Firebase数据库一起工作时,List
如果我使用GenericTypeIndicator
如下所示,我似乎无法检索类型的值:
snap.getValue(object : GenericTypeIndicator>() {})
它会从Firebase SDK中生成异常,如下所示:
com.google.firebase.database.DatabaseException: Generic wildcard types are not supported
at com.google.android.gms.internal.zzbtg.zza(Unknown Source)
at com.google.android.gms.internal.zzbtg.zza(Unknown Source)
at com.google.android.gms.internal.zzbtg.zza(Unknown Source)
at com.google.android.gms.internal.zzbtg.zza(Unknown Source)
at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
但是,如果我从Java调用它,如下所示,它可以工作:
snap.getValue(new GenericTypeIndicator>() {})
我猜它与类型reifying有关,所以我这样做:
inline fun genericType() = object: GenericTypeIndicator() {}
val stringListIndicator = genericType>()
snap.getValue(stringListIndicator)
但同样的例外发生了.
为什么会这样?
编辑:我尝试使用jadx-0.6.1反编译Java和Kotlin版本.
Java来源:
public class Randommmm {
private static final GenericTypeIndicator> ti = new GenericTypeIndicator>() {
};
public static List x(DataSnapshot snap) {
return snap.getValue(ti);
}
}
反编译:
public class Randommmm {
private static final GenericTypeIndicator> ti = new C12761();
static class C12761 extends GenericTypeIndicator> {
C12761() {
}
}
public static List m48x(DataSnapshot snap) {
return (List) snap.getValue(ti);
}
}
Kotlin来源(1):
object Randommmm {
private val ti = object : GenericTypeIndicator>() {
}
fun x(snap: DataSnapshot): List {
return snap.getValue(ti)
}
}
反编译:
public final class Randommmm {
public static final Randommmm INSTANCE = null;
private static final Randommmm$ti$1 ti = null;
static class C12761 extends GenericTypeIndicator> {
C12761() {
}
}
static {
Randommmm randommmm = new Randommmm();
}
private Randommmm() {
INSTANCE = this;
ti = new Randommmm$ti$1();
}
@NotNull
public final List m48x(@NotNull DataSnapshot snap) {
Intrinsics.checkParameterIsNotNull(snap, "snap");
Object value = snap.getValue(ti);
Intrinsics.checkExpressionValueIsNotNull(value, "snap.getValue(ti)");
return (List) value;
}
}
public final class Randommmm$ti$1 extends GenericTypeIndicator> {
Randommmm$ti$1() {
}
}
Kotlin来源(2)使用ArrayList
Doug的建议:
object Randommmm {
private val ti = object : GenericTypeIndicator>() {
}
fun x(snap: DataSnapshot): List {
return snap.getValue(ti)
}
}
反编译:
public final class Randommmm {
public static final Randommmm INSTANCE = null;
private static final Randommmm$ti$1 ti = null;
static class C12761 extends GenericTypeIndicator> {
C12761() {
}
}
static {
Randommmm randommmm = new Randommmm();
}
private Randommmm() {
INSTANCE = this;
ti = new Randommmm$ti$1();
}
@NotNull
public final List m48x(@NotNull DataSnapshot snap) {
Intrinsics.checkParameterIsNotNull(snap, "snap");
Object value = snap.getValue(ti);
Intrinsics.checkExpressionValueIsNotNull(value, "snap.getValue(ti)");
return (List) value;
}
}
public final class Randommmm$ti$1 extends GenericTypeIndicator> {
Randommmm$ti$1() {
}
}
Randy Sugian..
19
在Kotlin,
val ti = object : GenericTypeIndicator>() {}
生成为(在Java中):
SyntethicClass ti = new SyntethicClass();
public final class SyntethicClass extends GenericTypeIndicator> {}
注意通配符? extends String
而不是普通的String
.
有关说明,请参阅https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#variant-generics.
为了防止这种情况,请使用以下命令注释类型参数@JvmSuppressWildcards
:
val ti = object : GenericTypeIndicator>() {}
这变得非常难看,但它确实有效.或者,ArrayList
根据Doug的回答使用.
1> Randy Sugian..:
在Kotlin,
val ti = object : GenericTypeIndicator>() {}
生成为(在Java中):
SyntethicClass ti = new SyntethicClass();
public final class SyntethicClass extends GenericTypeIndicator> {}
注意通配符? extends String
而不是普通的String
.
有关说明,请参阅https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#variant-generics.
为了防止这种情况,请使用以下命令注释类型参数@JvmSuppressWildcards
:
val ti = object : GenericTypeIndicator>() {}
这变得非常难看,但它确实有效.或者,ArrayList
根据Doug的回答使用.