鉴于以下测试用例,其中有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,我们该怎么办?
答案 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.Nothing
。 scala.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()