【问题标题】:Scope of private visibility modifier for class in kotlinkotlin 中类的私有可见性修饰符的范围
【发布时间】:2018-02-06 09:07:45
【问题描述】:

当我尝试在同一个项目的 practice1.kt 和 practice2.kt 文件中创建私有 Person 类时,出现重新声明错误。例如:

Practice1.kt

private class Person constructor(var name: String, var age: Int){
var profession: String = "Not mentioned"

init{
    println("$name's details are being held in this class object.")
}

constructor(name:String,age:Int, profession: String): this(name,age){
    this.profession = profession
}

fun printPersonDetails(){
    println("$name whose profession is $profession, is $age years old.")

}}

fun main(args: Array<String>){
val smith = Person("Smith",20)
smith.printPersonDetails()}

Practice2.kt

private class Person(val name:String, age:Int){

var age: Int = age
set(new_data){
    println("Setting age to $new_data")
    field  = new_data
}}

在 Practice1.kt 的主函数中创建 smith Person 对象 时出现错误: 无法访问“Person”:它在文件中是私有的。

我认为私有类仅在包含文件中可见。为什么一个文件(practice1.kt)中的私有类会干扰另一个文件(practice2.kt)的私有类?

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    基本上,您面临的错误是由于您不能在相同的完全限定名下拥有两个类(包名+类简单名,例如com.example.MyClass 其中com.example 是该类的包MyClass)。

    此限制源自 JVM 体系结构,该体系结构禁止其类加载器加载具有相同 FQN 的多个类(如果它面临此类重复,则仅加载其中一个)。此外,由于类文件通常根据其 FQN 放置在文件系统中,因此副本的文件路径将相同。无论如何,允许重复的类似乎没有好处。

    请务必注意,您的情况下的范围仍然是正确的:除了声明它的文件之外,您无法访问其他文件中的 private 声明(重新声明不是一种用法)。

    您的情况的解决方法是将其中一个文件移动到不同的包中,并在开头声明包:

     package com.example
    

    【讨论】:

      【解决方案2】:

      我认为私有类仅在包含文件中可见。

      尽管文档声明 "If you mark a declaration private, it will only be visible inside the file containing the declaration",但这似乎不适用于类

      由于您的类在同一个包中,为了保留这两个类,您可以将它们放在不同的包中或给它们起不同的名称。

      【讨论】:

        猜你喜欢
        • 2014-11-06
        • 2015-05-08
        • 2019-02-22
        • 1970-01-01
        • 2015-09-06
        • 1970-01-01
        • 2019-03-24
        • 2020-12-15
        • 2019-04-01
        相关资源
        最近更新 更多