kotlin 中类的私有可见性修饰符的范围

Jax*_*xon 3 kotlin

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

练习1.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()}
Run Code Online (Sandbox Code Playgroud)

练习2.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
}}
Run Code Online (Sandbox Code Playgroud)

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

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

hot*_*key 6

基本上,您面临的错误是由于您不能在相同的完整限定名称下拥有两个类(包名称+类简单名称,例如类的包在哪里com.example.MyClass)这一事实引起的。com.exampleMyClass

这一限制源自 JVM 体系结构,该体系结构禁止其类加载器加载多个具有相同 FQN 的类(如果遇到此类重复项,则仅加载其中一个)。此外,由于类文件通常根据其 FQN 放置在文件系统中,因此重复项的文件路径将是相同的。不管怎样,允许重复的类似乎没有什么好处。

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

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

 package com.example
Run Code Online (Sandbox Code Playgroud)