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

kotlin中类的私有可见性修饰符的范围,kotlin,Kotlin,当我试图在同一个项目中的practice1.kt和practice2.kt文件中创建private 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 c

当我试图在同一个项目中的practice1.kt和practice2.kt文件中创建private 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()}
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对象时出错,该对象说: 无法访问“个人”:它在文件中是私有的。

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

我认为私有类只在包含的文件中可见

即使文档中指出,对于类来说,这似乎不是真的


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

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

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

需要注意的是,您的案例中的作用域仍然是正确的:除了声明它的文件外,您不能访问其他文件中的
private
声明(重新声明不是一种用法)

您的案例的解决方法是将其中一个文件移动到另一个包中,并在开始时使用包声明:

 package com.example