Kotlin 当类标记为“时,从其他包访问类属性”;开放式;使用“时失败”&引用;及=&引用;符号

Kotlin 当类标记为“时,从其他包访问类属性”;开放式;使用“时失败”&引用;及=&引用;符号,kotlin,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' ke

科特林的新朋友

在用于声明和访问属性的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
    }
}
我在尝试在app.foo包之外使用“tmpFoo.fooProp”时实际看到的错误是“'fooProp'在app.foo.FooClass中具有私有访问权限”,如果它调用(默认情况下)公共getter,那么这是没有意义的

我希望能够使用tmpFoo.fooProp访问getter,并使用tmpFoo.fooProp=“value”通过setter设置值,无论我在哪个包中


如果我删除FooClass上的open关键字,一切正常。

事实证明,我很愚蠢,试图从java类而不是kotlin类访问kotlin属性


在上面的例子中,BarClass是一个java类。

事实证明,我很愚蠢,试图从java类而不是kotlin类访问kotlin属性


在上面的例子中,BarClass是一个java类。

恐怕我无法重现您的问题。您是如何编译代码的,以及哪些版本当我将您的代码复制到IntelliJ(使用Kotlin 1.3.21或1.3.30)中时,
//此处的错误
行工作正常-但它在
getFooProp()
setFooProp()
上给出了“未解决的引用”错误。(这正是我所期望的。虽然Kotlin属性在字节码级别编译为getXxx()和setXxx()方法,但它们对Kotlin源代码不可见。虽然
open
会影响它们是否可以被重写,但不应影响它们的可见性。)我想我所做的是尝试从java类访问kotlin对象属性…kotlin属性编译到私有字段(如果需要),以及具有相关可见性的访问器方法。这是一个实现细节,Kotlin代码不可见;但是在Java中,您需要使用访问器方法。(相反,如果一个Java对象有标准的访问器,它看起来就像Kotlin代码的属性。)-你能编辑你的问题,展示如何重新创建问题吗?这对其他有同样问题的人都有帮助。恐怕我无法重现你的问题。您是如何编译代码的,以及哪些版本当我将您的代码复制到IntelliJ(使用Kotlin 1.3.21或1.3.30)中时,
//此处的错误
行工作正常-但它在
getFooProp()
setFooProp()
上给出了“未解决的引用”错误。(这正是我所期望的。虽然Kotlin属性在字节码级别编译为getXxx()和setXxx()方法,但它们对Kotlin源代码不可见。虽然
open
会影响它们是否可以被重写,但不应影响它们的可见性。)我想我所做的是尝试从java类访问kotlin对象属性…kotlin属性编译到私有字段(如果需要),以及具有相关可见性的访问器方法。这是一个实现细节,Kotlin代码不可见;但是在Java中,您需要使用访问器方法。(相反,如果一个Java对象有标准的访问器,它看起来就像Kotlin代码的属性。)-你能编辑你的问题,展示如何重新创建问题吗?这将帮助其他有同样问题的人。
// 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
    }
}