什么时候我们不能指定类型参数

时间:2017-07-07 10:20:11

标签: scala

鉴于以下测试用例,其中有3个场景。我会问这里的规则是什么,当我们必须以及何时不必指定类型参数

  @Test
  def testTypeParamter(): Unit = {

    class Cat[A]

    //1. Don't need to specify the type parameter for Cat
    def getCat() = new Cat
    println(getCat())

    import scala.collection.mutable.ArrayBuffer

    //2. Don't need to specify the type parameter for ArrayBuffer

    val bf = new ArrayBuffer()
    println(bf)

    //3. Do need to specify the type parameter for ArrayBuffer to make bf2 += 1 work
    val bf2 = new ArrayBuffer[Int]()
    bf2 += 1

    println(getCat())
  }

与#2和#3相比,如果我们创建一个没有类型参数的空ArrayBuffer,我们该怎么办?

2 个答案:

答案 0 :(得分:3)

让我们检查一下REPL,

1.1没有类型参数的方案

scala> class Bag[A]
defined class Bag

scala> def createBag = new Bag
createBag: Bag[Nothing]

1.2没有类型参数的ArrayBuffer [T]

scala>  val buffer = new ArrayBuffer()
buffer: scala.collection.mutable.ArrayBuffer[Nothing] = ArrayBuffer()

在这两种情况下,您都会将默认类型参数视为scala.Nothingscala.Nothing是抽象的,无法实例化,这意味着您无法在您的泛型实例上运行 buffer+=new String("apple")等因为Nothing位于scala class hierarchy的底部。

<强> 2。提供类型参数

这显然是具有泛型类型的目的,你想要特定类型的泛型。

scala> var buffer = new ArrayBuffer[Long]()
buffer: scala.collection.mutable.ArrayBuffer[Long] = ArrayBuffer()

scala> buffer+=89l
res0: scala.collection.mutable.ArrayBuffer[Long] = ArrayBuffer(89)

答案 1 :(得分:0)

当Scala推断您想要的类型时,您不需要指定类型参数。此推断基于方法/构造函数的参数(在您的情况下为none)和期望的类型(在您的情况下为none)。你也可以有例如。

val buffer: ArrayBuffer[Long] = new ArrayBuffer()