为什么kotlin允许声明变量与方法中的参数同名?

the*_*aba 9 kotlin

为什么kotlin允许声明变量与方法中的参数同名?有没有办法访问'隐藏'参数呢?

例:

fun main(args: Array<String>) {
    val args = Any()
}
Run Code Online (Sandbox Code Playgroud)

mie*_*sol 10

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

@Suppress("NAME_SHADOWING")
val args = Any()
Run Code Online (Sandbox Code Playgroud)

在某些情况下允许这样的阴影可能很方便,例如在参数验证后抛出自定义异常:

fun sample(name: String?) {
    @Suppress("NAME_SHADOWING")
    val name = name ?: throw CustomArgumentRequiredException()
    println(name.length)
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,无法访问阴影变量.

此刻也无法将警告变为错误.

  • 我也使用这种阴影来规范化参数值(例如string.trim()。toLowerCase())。我专门_want_使原始参数从其余范围中消失。 (3认同)

phi*_*sch 9

这称为阴影,对于将代码与系统其他部分解耦很有用。可能是因为名称绑定到当前作用域。

考虑一下:

Foo从其他人继承了一个类,比如说一个API。在代码中,您将引入一个变量bar。的作者Foo还更新了他的代码,还添加了一个变量bar。没有本地范围,您将发生冲突。

顺便说一下,这在包括Java在内的其他JVM基本语言中也是可能的,并且通常在构造函数或设置方法中使用:

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

public void setFoo(String foo) {
    this.foo = foo;
}
Run Code Online (Sandbox Code Playgroud)

阴影不仅适用于参数,其他事物也可以阴影:字段,方法甚至类。

大多数IDE都会警告您有关阴影的信息,因为它可能会造成混淆。

对我们自己的代码的建议:

尝试避免出现阴影有两个原因:

  • 您的代码将变得难以阅读,因为两个不同的事物具有相同的名称,这会导致混乱。
  • 一旦被遮盖,您将无法再访问范围内的原始变量。