我是scala的新手,在java NIO库(来自scala 2.10.x)中调用“泛型”函数时出现问题。将代码简化为简单的测试:
import java.net._
import java.nio.channels.{MembershipKey, DatagramChannel}
object Test {
val channel = DatagramChannel.open(StandardProtocolFamily.INET)
.setOption(StandardSocketOptions.SO_REUSEADDR, true)
...
}
这导致:
Error:(40, 48) type mismatch;
found : java.net.SocketOption[Boolean]
required: java.net.SocketOption[Any]
Note: Boolean <: Any, but Java-defined trait SocketOption is invariant in type T.
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)
channel.setOption(StandardSocketOptions.SO_REUSEADDR, true)
^
我认为有一些方法可以解决这个问题,而无需在java中编写包装器。尝试过以各种方式重铸但没有成功。
问题:如何解决上述问题?
答案 0 :(得分:5)
方法setOption
是多态的
setOption[T](name: SocketOption[T], value: T): DatagramChannel
所以在打电话时
setOption(StandardSocketOptions.SO_REUSEADDR, true)
scala看到参数类型略有不同
StandardSocketOptions.SO_REUSEADDR: SocketOption[java.lang.Boolean]
true: scala.Boolean
并且编译器尝试将T
缩小到java.lang.Boolean <: AnyRef
和scala.Boolean <: AnyVal
之间最常见的类型Any
要解决此问题,您需要为setOption
setOption[java.lang.Boolean](StandardSocketOptions.SO_REUSEADDR, true)
或使用类型归属(然后将正确推断出T
)
setOption(StandardSocketOptions.SO_REUSEADDR, true: java.lang.Boolean)