当前位置: 首页 > 知识库问答 >
问题:

使用时,当类被标记为“open”时,从不同的包访问类属性会失败。和“=”符号

温凯
2023-03-14

新到kotlin...

在用于声明和访问属性的 kotlin 文档中,它说您可以使用点表示法和“=”语法(调用 getters 和 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
}

这似乎适用于常规类,但如果您将一个类声明为打开的,并尝试从另一个包访问类属性,这似乎是不可能的,您必须显式使用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 中具有私有访问权限”,如果它调用(默认情况下)公共 getter,则没有意义。

我期望的是能够使用tmpFoo.fooProp访问getter,并且tmpFoo.fooProp="value"通过setter设置值,无论我在什么包中。

如果我删除了FooClass上的open关键字,一切都按预期工作。

共有1个答案

庾才
2023-03-14

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

在上述示例中,BarClass是一个java类。

 类似资料:
  • 我希望你能帮助我。 我的问题是: 当传递数组列表中的对象的实例时,我将该数组列表传递给另一个类,如何访问它的属性? 我可以在将其传递给另一个类之前访问属性。 “主要”类将数据传递给“员工”类。 “Employees”类接收数据,将其添加到一个数组中,然后从该数组转到“AllStaff”类 请注意,我可以在方法“addToAll人员()”中访问属性 在类"所有的工作人员",是我没有访问的属性 完整代

  • 问题内容: 我有一个像下面这样的课程: 我想为源变量传递一个字符串,并访问同名的类成员。 我已经尝试过仅对函数有效(据我所知)以及具有extend和using ,但这也不起作用。做这个的最好方式是什么? 问题答案: 如果命名self的ANY属性(包括您的示例中的),将可以完美地工作。

  • 我已经从Java7迁移到Java8。当我执行时,我的构建成功。但是当我执行时,站点生成失败,表示: [错误]无法在项目XXXXXX上执行目标org.apache.maven.plugins:maven-site-plugin:3.4:site(default-site):生成maven-javadoc-plugin:2.8:test-javadoc: 下面是我的 我们的测试中有些Javadoc标记

  • 问题内容: 因此,我可以使用进行访问,但如何访问? 问题答案: 您可以这样操作:

  • 问题内容: 我想将一个对象添加到Global范围,并且为了构造它,我需要将其传递到文件的路径。我不想在源代码中对文件路径进行硬编码,因此我想从application.conf中获取该路径。 问题是我不知道如何从java类访问这些属性。我尝试了这个: 但是它以 NullPointerException 结尾。 假设我可以使用一个全局Configuration实例,这是我错了吗?谢谢。 问题答案: 尝

  • 问题内容: 使用Type通配符的Update()也存在该问题,但是我发现DocumentExists()的作用相同,因此在此将问题简化如下: 这有效… 但这失败了 如果我完全省略Type,它也会失败。有人知道如何进行这项工作吗?(即使不管文档的类型如何都可以,对我而言还是可以的。) 问题答案: 据我所知,不可能在类型名称中指定通配符,但是您可以做一些技巧。 您可以在索引中查询具有特定ID的文档,并