Scala有一个很好的功能来推断模式匹配中的类型参数.它还检查模式匹配穷举.例如:
sealed trait PField[T]
case object PField1 extends PField[String]
case object PField2 extends PField[Int]
def getValue[X](f: PField[X]): X = f match {
case PField1 => "aaa"
case PField2 => 123
}
Run Code Online (Sandbox Code Playgroud)
是否可以实现相同但使用类型成员而不是类型参数?
sealed trait Field {
type T
}
case object Field1 extends Field {
type T = String
}
case object Field2 extends Field {
type T = Int
}
Run Code Online (Sandbox Code Playgroud)
以下解决方案不起作用(在Scala 2.12.6中测试):
//No exhaustiveness check
def getValue[X](f: Field {type T = X}): X = f match {
case Field1 …Run Code Online (Sandbox Code Playgroud) 我使用jdk10运行了我的库的测试,他们在50%的情况下随机失败.我提取了非常小的代码片段来重现错误并在循环计数失败中运行它.1M试验的失败次数通常约为10万至70万.
我到现在才发现:
addressToBytes方法中更改第二行和第三行的顺序时,它可以正常工作SomeOutputStream工作我使用scala 2.12.6和javac选项:-source 1.8和-target 1.8.Windows和Linux都会出现此问题.
基本问题是为什么addressToBytes方法并不总是返回相同的结果?
有时代替预期的数组:[4,10,10,10,10]地址的某些部分被替换为0.例如:[4,10,10,10,0]
以下是可用于重现问题的代码:
import java.io.OutputStream
import java.net.InetSocketAddress
object RaceCondition {
class SomeOutputStream(val data: Array[Byte], var currentIndex: Int) extends OutputStream {
override def write(bytes: Array[Byte], off: Int, len: Int): Unit = {
System.arraycopy(bytes, off, data, currentIndex, len)
currentIndex += bytes.length
}
def write(b: Int): Unit = {
data.update(currentIndex, b.toByte)
currentIndex += 1
}
}
def addressToBytes(sAddress: InetSocketAddress): Array[Byte] = {
val result: …Run Code Online (Sandbox Code Playgroud)