Я не эксперт по Scala, но ваш код ведет себя именно так, как я ожидал.
Во-первых, вам нужно знать, что параметр типа метода не обязательно привязан к классу.
Например, следующее действительное Scala:
class Test1 {
def test[A] (x: A) = println(x)
}
И следующее также является действительным кодом Scala, единственное отличие состоит в том, что этот код вообще не использует тип A.
class Test2[A] {
def test (x: Int) = println(x)
}
Так что я думаю, что теперь все ясно, сначала вы создали экземпляр MyTest [Int], что нормально.
scala> val test = new MyTest[Int]
test: MyTest[Int] = MyTest@308ff65f
Затем вы вызвали checkString [A, Int] без параметра предоставления типа.A, поскольку это универсальная функция, компилятор должен определить, какой тип является A.
scala> test.checkString("String",1)
Value is a String
x is not a String
res7: java.lang.String = String
Примечание:
В этот момент времени Scala уже знает, что x должен быть Int иего тип фиксирован, так как вы предоставляете его MyTest [Int].Таким образом, следующий код выдаст ошибку компиляции.
scala> val t = new MyTest[Int]
t: MyTest[Int] = MyTest@cb800f
scala> t.checkString ("A", "B")
<console>:8: error: type mismatch;
found : java.lang.String("B")
required: t.MyType
t.checkString ("A", "B")
Теперь компилятор просматривает предоставленные вами аргументы и обнаруживает, что это
checkString ("String", 1)
, что соответствует
checkString (value: A, x: Int)
Итак, теперь компилятор знает, что тип A в checkString [A, Int] должен быть строкой, и если вы все это сделаете вручную, ваш код будет выглядеть следующим образом.
scala> val test = new MyTest[Int]
test: MyTest[Int] = MyTest@5bda13
scala> test.checkString[String]("String", 1)
Value is a String
x is not a String
res1: String = String
scala> test.checkString[Int] (3, 4)
Value is not a String
x is not a String
res4: Int = 3
scala> test.checkString[Int] ("String", 4)
<console>:8: error: type mismatch;
found : java.lang.String("String")
required: Int
test.checkString[Int] ("String", 4)
^