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

当我尝试在同一个项目中的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){ 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中的main函数中创建smith Person对象时出现错误: 无法访问“Person”:它在文件中是私有的。

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

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

这个限制来源于JVM体系结构,该体系结构禁止它的类加载器使用相同的FQN加载多个类(如果它面对这样的重复,它只加载其中的一个)。 而且,由于类文件通常被放置在文件系统中,因此它们的FQN相同,所以重复的文件路径将是相同的。 无论如何,允许重复的课程似乎导致不好。

请注意,您的案例中的范围确定仍然是正确的:您不能访问除声明它的其他文件中的private声明(重新声明不是用法)。

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

  package com.example 

我以为私人类只在包含文件中可见。

即使文档中声明“如果你将一个声明标记为私有的,它只会在包含该声明的文件中可见” ,但对于类来说并不是这样

由于你的课程在同一个包中,为了保持这两个课程,你可以把它们放在不同的包中,或给它们不同的名字。