避免使用`Boolean.box`

时间:2014-11-11 16:45:51

标签: scala scala-java-interop

我从io.netty.bootstrap.BootStrap调用一个java方法 有以下签名:

public <T> B option(ChannelOption<T> option, T value)

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

b.option(ChannelOption.SO_KEEPALIVE, true);

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

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)
                         ^

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

b.option(ChannelOption.SO_KEEPALIVE, Boolean.box(true));

这编译并运作。没有box调用,有没有办法让这个更漂亮?

任何人都可以翻译该编译错误吗?

谢谢。

1 个答案:

答案 0 :(得分:6)

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

b.option[java.lang.Boolean](ChannelOption.SO_KEEPALIVE, true)