Scala 2.11中无法将Array[T<:AnyRef]元素设为null如何解决
编译错误原因
Scala 2.x 泛型上下文存在默认类型检查限制:即使已经声明泛型参数T <: AnyRef,编译器也不会自动将null(静态类型为Null)判定为T的合法实例,直接给Array[T]的元素赋值null就会抛出类型不匹配的编译错误。
可用实现方案
根据性能和代码改动量需求,任选其一即可:
最小改动适配
对null做显式泛型类型转换即可通过编译,注意清空数组后需要同步重置大小计数器,避免逻辑bug:def doclear(): Unit = { for (i <- data.indices) { data(i) = null.asInstanceOf[T] } currentSize = 0 }该写法运行时无任何安全问题,引用类型数组本身就允许存储null值。
高性能实现(推荐)
不需要遍历数组逐位赋值,直接替换数组引用即可。JVM分配新的引用类型数组时会自动将所有元素初始化为null,比手动遍历赋值效率更高:def doclear(): Unit = { data = new Array[T](data.length) currentSize = 0 }JDK工具类实现
可以直接调用JDK内置的数组填充方法完成批量赋值,效果和手动遍历一致:def doclear(): Unit = { java.util.Arrays.fill(data, null.asInstanceOf[T]) currentSize = 0 }
可选代码优化
你当前写的辅助构造器可以通过主构造器加默认参数简化,不需要额外定义重载构造方法;currentSize建议显式初始化,提升代码可读性:
class CuckooHashTable[T <: AnyRef: ClassTag](val hashFamily: HashFamily[T], initialSize: Int = DEFAULT_TABLE_SIZE) { private var data: Array[T] = new Array[T](initialSize) private val numHashFunctions = hashFamily.getNumberOfFunctions private var currentSize: Int = 0 // 其余业务方法保持不变 } object CuckooHashTable{ private val MAX_LOAD = 0.4 private val ALLOWED_REHASHS = 1 private val DEFAULT_TABLE_SIZE = 101 }
内容的提问来源于stack exchange,提问作者syumia Liu
相关产品推荐
相关产品推荐

