Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Kotlin允许在方法中使用与参数同名的变量声明?_Kotlin - Fatal编程技术网

为什么Kotlin允许在方法中使用与参数同名的变量声明?

为什么Kotlin允许在方法中使用与参数同名的变量声明?,kotlin,Kotlin,为什么Kotlin允许在方法中使用与参数同名的变量声明?还有,有没有办法访问“隐藏”参数 例如: fun main(args: Array<String>) { val args = Any() } fun main(args:Array){ val args=Any() } Kotlin确实发出了关于名称阴影的警告,您可以使用以下方法抑制该警告: @Suppress("NAME_SHADOWING") val args = Any() 在某些情况下,允许这种阴影可能很方

为什么Kotlin允许在方法中使用与参数同名的变量声明?还有,有没有办法访问“隐藏”参数

例如:

fun main(args: Array<String>) {
    val args = Any()
}
fun main(args:Array){
val args=Any()
}

Kotlin确实发出了关于名称阴影的警告,您可以使用以下方法抑制该警告:

@Suppress("NAME_SHADOWING")
val args = Any()
在某些情况下,允许这种阴影可能很方便,例如在参数验证后引发自定义异常:

fun sample(name: String?) {
    @Suppress("NAME_SHADOWING")
    val name = name ?: throw CustomArgumentRequiredException()
    println(name.length)
}
不幸的是,无法访问带阴影的变量


此时也不可能转向。

这被称为阴影,它有助于将代码与系统的其他部分分离。这是可能的,因为名称绑定到当前范围

考虑这一点:

您可以从其他人(比如API)中对类
Foo
进行子类化。在代码中引入变量
bar
Foo
的作者还更新了他的代码,并添加了一个变量
bar
。如果没有局部作用域,就会产生冲突

顺便说一句,这在其他JVM基础语言(包括Java)中也是可能的,并且通常在构造函数或setter中使用:

public TestClass(int value, String test) {
    this.value = value;
    this.test = test;
}

public void setFoo(String foo) {
    this.foo = foo;
}
阴影不仅适用于参数,其他东西也可以阴影:字段、方法甚至类

大多数IDE都会警告您有关阴影的问题,因为它可能会令人困惑

推荐我们自己的代码:

出于两个原因,请尽量避免阴影:

  • 您的代码变得难以阅读,因为两个不同的东西具有相同的名称,这会导致混淆
  • 一旦阴影化,就不能再访问范围内的原始变量
如果还没有实现,或者有新的人出现,也要注意一些事情。在kotlin中,如果参数未以var/val作为前缀,则在将其添加为属性之前,您无权访问这些参数。因此,如果将基本类定义为:

class Person(name: String, age: Int){

}
你不能使用名字或年龄,直到他们在范围内;但是,没有必要对其进行阴影处理 除了米恩索尔指出的预期原因之外,但出于基本的考虑

class Person(name: String, age: Int){
     var name = name 
     var age = age
}
在构造函数中执行这些操作

class Person(var name: String, private var age: Int){           
}

当然,您还可以根据您对所创建对象的签名进行访问。

我也使用这种阴影来规范化参数值(例如
string.trim().toLowerCase()
)。我特别希望原始参数从作用域的其余部分消失