我正在尝试将我的Android项目切换到Kotlin。我有一个< code>EditText(一个< code>TextView的子类),我想以编程方式为它设置一个提示和文本。提示按预期工作。但是,对于文本,如果我尝试使用Kotlin setter语法,就会得到类型不匹配异常:
val test = EditText(context)
test.setHint("hint") // Lint message: "Use property access syntax"
test.hint = "hint" // ok
test.setText("text") // ok (no lint message)
test.text = "text" // Type mismatch: inferred type is kotlin.String but android.text.Editable! was expected
如果我们看一下声明,我们会发现从 TextView
继承的相同签名:
public final void setHint(CharSequence hint)
public final void setText(CharSequence text)
我的印象是 x.y = z
是 x.setY(z)
的快捷方式,但显然这种印象是错误的。setText()
被视为普通方法而不是 setter,但这两种方法之间有什么区别,使编译器的行为不同?我唯一能想到的是,文本视图
有一个 mHint
属性,但我认为情况可能并非如此。
还有一点我不太明白的是,< code > Android . text . editable 是从哪里来的?没有对应的< code>setText(Editable)方法,也没有这种类型的公共字段。
或者,您可以编写一个扩展:
fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this)
然后,您可以这样使用它:
mEditText.text = myString.toEditable()
为了避免类型不匹配,可以使用可编辑类的工厂内部类。所以你现在可以这样做:
textview.text = Editable.Factory.getInstance().newEditable("your text")
当生成Java getter/setter对的合成属性时,Kotlin首先寻找一个getter。吸气剂足以用一种类型的吸气剂产生合成性质。另一方面,如果只有一个setter存在,则属性不会被创建。
当设置程序开始运行时,属性创建变得更加困难。原因是getter和setter可能具有不同的类型。此外,getter和/或setter可能在子类中被重写。
在你的例子中,文本视图
类包含一个 getter 字符序列 getText()
和一个 setter void set文本(字符序列)
。如果您有一个 TextView
类型的变量,您的代码将正常工作。但是你有一个类型为编辑文本
的变量。并且编辑文本
类包含一个被覆盖的 getter 可编辑 getText()
,这意味着您可以获取编辑文本的可编辑
,
并将可编辑
设置为编辑文本
。因此,Kotlin 合理地创建了一个可编辑
类型的合成属性文本
。字符串
类不可编辑
,这就是不能将字符串
实例分配给 EditText
类的文本
属性的原因。
工作正常。 现在假设setter内部有一些复杂的功能,稍后Java类中的字段被更改为,而不是。不会出现编译错误,但Kotlin调用将更改的值,跳过setter中发生的其他事情,并且可能会被忽略,导致逻辑错误。因此,我想知道:使用Kotlin属性访问语法来设置java字段是否安全?
我已经实现了RecycraView. ViewHolder子类如下: 现在,我正试图访问在它中声明的绑定属性,就像在回收站视图的子类中一样。适配器: 但编译器正在抱怨—— 以下是完整的实现: 如果我在这里错过了什么,有什么想法吗?请建议。
null 从我的类中调用这些代码的工作方式与我预期的一样。但是,我想在Kotlin子类之外调用其中的一个方法。 如果从不同的Kotlin类尝试,则会出现以下编译错误: 未解析得引用:completeWakefulIntent
Kotlin具有委托属性,这是一个非常好的特性。但我正在研究如何获取和设置这些值。假设我想得到委托的财产的价值。在get()方法中,如何访问该值? 这是我如何实施的一个例子: 我无法理解的主要问题是,我如何将值设置为委托类被分配到的实际属性。当我将“NEW”赋给属性< code>p时,如何将该值存储到变量< code>p中,或者使用get读取传递给< code>p的新值?我是不是错过了一些基本的东
嗨,我是Java泛型的新手,我正在尝试访问泛型类中的属性。到目前为止,我已经找到了C#相关的答案,如果有人能指导我如何在java中做到这一点,那将是非常有帮助的。假设我有Class Car,它有整数型轮子和字符串型模型的属性。现在我有一个方法,比如