小编sik*_*kor的帖子

具有类型成员的案例对象上的模式匹配

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)

generics types scala pattern-matching type-members

9
推荐指数
1
解决办法
475
查看次数

使用jdk10在Scala中进行不确定的数组复制

我使用jdk10运行了我的库的测试,他们在50%的情况下随机失败.我提取了非常小的代码片段来重现错误并在循环计数失败中运行它.1M试验的失败次数通常约为10万至70万.

我到现在才发现:

  1. 代码在jdk8中工作,在jdk9和jdk10中失败
  2. 当您在addressToBytes方法中更改第二行和第三行的顺序时,它可以正常工作
  3. 当你的内联方法SomeOutputStream工作
  4. 禁用最后一级java优化时:-XX:TieredStopAtLevel = 3它可以工作
  5. 在调试模式下运行此代码时,它主要起作用.

我使用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)

scala compiler-optimization

7
推荐指数
0
解决办法
59
查看次数