kotlin的新手...
在用于声明和访问属性的kotlin文档中,它说您可以使用点表示法和“ =”语法来访问类对象的属性,这将调用getter和setter:
To use a property, we simply refer to it by name, as if it were a field in Java:
fun copyAddress(address: Address): Address {
val result = Address() // there's no 'new' keyword in Kotlin
result.name = address.name // accessors are called
result.street = address.street
// ...
return result
}
这似乎与常规类一起使用,但是如果您将一个类声明为open并尝试从另一个包中访问类属性,则这似乎不合时宜,您被迫显式使用getter和setter。这是正确的吗?如果正确,为什么?
package app.foo
open class FooClass {
var fooProp = "test";
fun doSomething() {
// Just to show what's going on
val tmpFoo = FooClass()
tmpFoo.fooProp // No error here
tmpFoo.fooProp = "New Value" // No error here
}
}
// Different Class, same package
package app.foo
import app.foo.FooClass
class Foo2Class {
fun doSomething() {
// Just to show what's going on
val tmpFoo = FooClass()
tmpFoo.fooProp // No error here
tmpFoo.fooProp = "New Value" // No error here
}
}
// Different Class, different package
package app.bar
import app.foo.FooClass
class BarClass {
fun doSomething() {
// Just to show what's going on
val tmpFoo = FooClass()
tmpFoo.fooProp // Error here
tmpFoo.fooProp = "New Value" // Error here
tmpFoo.getFooProp() // No error here
tmpFoo.setFooProp("New Value") // No error here
}
}
尝试在app.foo包之外使用“ tmpFoo.fooProp”时实际上看到的错误是“'fooProp'在app.foo.FooClass中具有私有访问权”,如果它是调用(默认情况下)公共获取器。
我希望能够使用tmpFoo.fooProp来访问getter,并且无论我在哪个软件包中,都可以使用setter通过tmpFoo.fooProp =“ value”来设置值。
如果我删除FooClass上的open关键字,那么一切都会按预期进行。
答案 0 :(得分:0)
事实证明,我很愚蠢,试图从Java类而不是kotlin类访问kotlin属性。
在上面的示例中,BarClass是一个Java类。