当我尝试在同一项目中的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的main函数中创建 smith Person object 时遇到错误: Cannot access 'Person': it is private in file.
我认为私有类只在包含文件中可见 . 为什么一个文件(practice1.kt)中的私有类干扰了另一个文件(practice2.kt)的私有类?
2 回答
基本上,您所面临的错误是由于您不能在相同的完全限定名称下拥有两个类(包名称类简单名称,例如
com.example.MyClass
,其中com.example
是类MyClass
的包) .此限制源自JVM体系结构,该体系结构禁止其类加载器使用相同的FQN加载多个类(如果它面临这样的重复,它只加载其中一个) . 此外,由于类文件通常根据其FQN放置在文件系统中,因此重复项的文件路径将是相同的 . 无论如何,允许重复的课程似乎没有任何好处 .
重要的是要注意你的案例中的作用域仍然是正确的:你不能访问声明它的其他文件中的
private
声明(重新声明不是用法) .您的案例的解决方法是在开头使用包声明将其中一个文件移动到另一个包:
即使文档声明"If you mark a declaration private, it will only be visible inside the file containing the declaration",这对类来说似乎也不是这样
由于您的类在同一个包中,为了保留这两个类,您可以将它们放在不同的包中或为它们指定不同的名称 .