当我尝试在同一项目的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)的私有类?
基本上,您面临的错误是由于您不能在相同的完整限定名称下拥有两个类(包名称+类简单名称,例如类的包在哪里com.example.MyClass)这一事实引起的。com.exampleMyClass
这一限制源自 JVM 体系结构,该体系结构禁止其类加载器加载多个具有相同 FQN 的类(如果遇到此类重复项,则仅加载其中一个)。此外,由于类文件通常根据其 FQN 放置在文件系统中,因此重复项的文件路径将是相同的。不管怎样,允许重复的类似乎没有什么好处。
重要的是要注意,您的情况中的范围仍然是正确的:private除了声明它的文件之外,您无法访问其他文件中的声明(重新声明不是一种用法)。
针对您的情况的解决方法是将其中一个文件移动到另一个包,并在开头添加包声明:
package com.example
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
587 次 |
| 最近记录: |