gpt4 book ai didi

android - 通用@BindingConversion 不起作用

转载 作者:行者123 更新时间:2023-11-29 20:04:22 25 4
gpt4 key购买 nike

为什么不能在 android 数据绑定(bind)库中定义泛型绑定(bind)转换?

@BindingConversion
public static <T> T convertMyClass(MyClass<T> obj) {
return obj.get();
}

通过这种方法,我得到了 can not find the setter for attribute 'android:text' with parameter type com.example.MyClass<java.lang.String>错误。定义显式类型没问题。

我试图找到路 ObservableField<T>正在转换但没有成功。有谁知道这是怎么回事?我做错了什么吗?

最佳答案

两个词:type erasure .

泛型是一把双刃剑,它切断了类型系统的某些运行时功能以换取编译时检查。您告诉编译器重写代码以使这些类型转换“正常工作”。权衡是它必须将通用类引用(如“T”)转换为“Object”。所以编译后你的方法的签名是

Object convertMyClass(MyClass)

数据绑定(bind)系统正在寻找返回类型“String”。所以甚至不考虑你的方法。

数据绑定(bind)系统可能会变得更智能,以便能够识别您的 BindingConversion,但我不会为该功能屏住呼吸。

这是一些说明类型删除的 bash。

$ echo 'public class A{ public <T> T deRef(java.util.concurrent.atomic.AtomicReference<T> atom) {return atom.get();} }' >A.java
$ javac A.java
$ groovy -e 'println A.class.getMethod("deRef", java.util.concurrent.atomic.AtomicReference.class)'
public java.lang.Object A.deRef(java.util.concurrent.atomic.AtomicReference)

最后一行输出是泛型方法的方法签名。

解决方法是使用特定的参数化子类对 MyClass 进行子类化,如下所示:

public class MyStringClass extends MyClass<String> {
@Override
public String get() {
return super.get();
}
@BindingConversion
public static String convertMyClass(MyStringClass obj) {
return obj.get();
}
}

关于 ObservableField ,它不需要 BindingConversion 机制,因为数据绑定(bind)库在 java 代码中引用它,因此编译时泛型检查会完成匹配类型的工作。

关于android - 通用@BindingConversion 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35848604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com