最近在用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],从而导致编译报错。
正解
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。