2017-07-07 73 views
0

給定下面的測試用例,其中有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沒有我們能做些什麼類型參數

回答

3

讓我們在REPL檢查,

1.1情景沒有Param類型

scala> class Bag[A] 
defined class Bag 

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

1.2 ArrayBuffer [T],而不型PARAM

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) 
+0

感謝@prayagupd的有用答案。 REPL是一個很好的工具,但我忘了它.. – Tom

+0

是的,Scala REPL或clojure REPL是快速嘗試的非常重要的工具。關於何時可以使用'泛型[Nothing]',我不認爲你會想要使用它,而是使用'Option [泛型[T]]'。順便說一句['None'](http://www.scala-lang.org/api/2.7.0/scala/None$object.html)已經擴展了'Option [Nothing]'。 – prayagupd

0

你不需要的時候斯卡拉推斷你想類型指定類型參數。這個推論是基於方法/構造函數的參數(在你的案例中是none)和期望的類型(在你的案例中是none)。你也可以有例如

val buffer: ArrayBuffer[Long] = new ArrayBuffer() 
相關問題