最近在用Scala调用Java的多态类。
...
bootstrap.group(bossGroup, workerGroup)
//创建NioServerSocketChannel
.channel(classOf[NioServerSocketChannel])
//绑定I/O事件处理类
.childHandler(new ChannelInitializer[SocketChannel] {
override def initChannel(ch: SocketChannel): Unit = {
ch.pipeline().addLast(
// new ObjectEncoder,
// new ObjectDecoder(ClassResolvers.cacheDisabled(getClass.getClassLoader)),
new ServerHandler
)
}
}).option(ChannelOption.SO_BACKLOG, 128)
...
Java中的Code
public <T> B option(ChannelOption<T> option, T value) {
if (option == null) {
throw new NullPointerException("option");
}
if (value == null) {
synchronized (options) {
options.remove(option);
}
} else {
synchronized (options) {
options.put(option, value);
}
}
return (B) this;
}
Error:(38, 31) type mismatch;
found : io.netty.channel.ChannelOption[Integer]
required: io.netty.channel.ChannelOption[Any]
Note: Integer <: 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)
}).option(ChannelOption.SO_BACKLOG, 128)
这个是问题。不是说Scala调用Java是无缝的吗。现在卡在这里了。想问哪位遇到过
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
.option(ChannelOption.SO_BACKLOG, Integer.valueOf(128))
######问题解决了。我没有明白我直接写128和Integer.valueOf(128)这两个区别发生在了哪里######
option方法声明为:
public <T> B option(ChannelOption<T> option, T value)
由于Integer和Int的共同父类型是Any,如果value参数传入Int类型,则Scala编译器在类型推断时会认为option参数的类型应该是ChannelOption[Any],从而导致编译报错。
######option方法声明为:
public <T> B option(ChannelOption<T> option, T value)
由于Integer和Int的共同父类型是Any,如果value参数传入Int类型,则Scala编译器在类型推断时会认为option参数的类型应该是ChannelOption[Any],从而导致编译报错。
正解