避免使用`Boolean.box`

sim*_*mao 5 scala scala-java-interop

我正在调用一个io.netty.bootstrap.BootStrap具有以下签名的java方法:

public <T> B option(ChannelOption<T> option, T value)
Run Code Online (Sandbox Code Playgroud)

我使用以下代码来调用此方法:

b.option(ChannelOption.SO_KEEPALIVE, true);
Run Code Online (Sandbox Code Playgroud)

这无法编译,出现以下错误:

Error:(57, 30) type mismatch;
 found   : io.netty.channel.ChannelOption[Boolean]
 required: io.netty.channel.ChannelOption[Any]
Note: Boolean <: Any, but Java-defined class ChannelOption is invariant in type T.
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)
      b.option(ChannelOption.SO_KEEPALIVE, true); // (4)
                         ^
Run Code Online (Sandbox Code Playgroud)

我不完全理解这说的是什么,但我理解它抱怨得到一个布尔值,因为它是参数化 Any而不是Boolean.所以我尝试了以下代码,它的工作原理:

b.option(ChannelOption.SO_KEEPALIVE, Boolean.box(true));
Run Code Online (Sandbox Code Playgroud)

这编译和工作.有没有办法让这个更漂亮没有box电话?

有人可以翻译那个编译错误吗?

谢谢.

Gab*_*lla 6

Java泛型在scala中是不变的,因此您无法传递scala Boolean并按照您的预期推断类型.明确注释类型应修复它:

b.option[java.lang.Boolean](ChannelOption.SO_KEEPALIVE, true)
Run Code Online (Sandbox Code Playgroud)