【问题标题】:What does "implicit anonymous class parameter" mean in this context?在这种情况下,“隐式匿名类参数”是什么意思?
【发布时间】:2017-07-07 05:22:50
【问题描述】:

在 Android Studio 中,以下代码将变量 commandBytes 着色以指示“隐式匿名类参数”:

public boolean writeCommand( byte[] commandBytes ) {
if( writeCommandInProgress.compareAndSet( false, true ) ) { 
    writeSubscription = bleDevice
            .establishConnection( asBleServiceRef, false )
            .flatMap( rxBleConnection -> rxBleConnection.writeCharacteristic( asInputCharId, commandBytes) )
            .subscribe( 
                    characteristicValue -> { 
                        writeCommandInProgress.set( false ); 
                        if( !Arrays.equals( characteristicValue, commandBytes ) )
                            Log.d( LOG_TAG, "Data read back from writeCommand() doesn't match input");
                    },
                    throwable -> Log.d( LOG_TAG, "Error in writeCommand: " + commandBytes.toString() + "; " + throwable.getMessage() )
            );
    return true;
    } else return false;
}

我不明白这是什么意思。 JetBrains 帮助网站上的描述并没有真正帮助:“这是一个局部变量,由方法内部的匿名或本地类使用,因此成为匿名类的一个字段。”这如何应用?这是我需要担心的事情吗?

【问题讨论】:

  • 我很好奇,谷歌搜索了一下,我发现你是互联网上唯一一个问这个问题的人 :-) 对它的含义的解释似乎很明显,但它的含义并不完全清楚那可能是。几个猜测:也许只是为了让你知道它会持有一个引用,所以可能不会被 GC 处理?警告潜在的多线程问题?
  • 另一方面,如果这是生产代码,那么维护它的人会讨厌你。没有人能够在不花费大量时间的情况下查看并确定它的作用。
  • 实际上不是生产代码,而是来自 RxAndroidBle 库作者的稍微改编的 sn-p,用于测试目的。至于解释很明显,请通过指出该变量是隐式参数的匿名类来帮助我?
  • @RobertLewis 可以请您回复..!我的回答

标签: java android-studio intellij-idea


【解决方案1】:

着色表示参数或局部变量在外部声明并在匿名类(或本例中的 lambda)内部使用。为了实现这一点,javac 编译器将在匿名类中创建一个合成字段来存储变量。您可以通过检查字节码 (View > Show Bytecode) 来查看这一点。

这不是什么值得担心的事情,也不是警告,它只是提供信息的语法着色。这确实意味着该变量是隐式或显式最终的,因此不可能在不破坏编译的情况下重新分配它。

【讨论】:

  • 啊,我没能在“匿名类”和“lambda”之间建立联系。也许 JetBrains 应该考虑为 Java 8 更新此消息。
猜你喜欢
  • 2020-04-04
  • 2017-03-28
  • 2016-08-26
  • 2014-10-27
  • 2019-10-15
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
相关资源
最近更新 更多