我从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
调用,有没有办法让这个更漂亮?
任何人都可以翻译该编译错误吗?
谢谢。
答案 0 :(得分:6)
Java泛型在scala中是不变的,因此您无法传递scala Boolean
并按照您的预期推断出类型。明确注释类型应该修复它:
b.option[java.lang.Boolean](ChannelOption.SO_KEEPALIVE, true)