[英]Bug in Scala's type system?
以下scala代碼似乎有效:
class A[X]
class C[M[X] <: A[X]]
class Main
new C[A]
我希望編譯器在類型A上執行類型推斷,但是在我嘗試以下操作之后:
new C[A[Int]]
我收到以下錯誤消息:
(fragment of Main.scala):11: error: this.A[Int] takes no type parameters, expected: one
println( new C[A[Int]] )
讓我們用簡單的英語看看這意味着什么。
class A[X]
意思是:讓A成為一個帶有一個類型參數的類。
class C[M[X] <: A[X]]
意味着:讓C成為一個帶有一個類型參數的類,該類應該是一個帶有一個類型參數的類AND,參數化,是一個用相同類型參數化的類A的子類。
當你寫作
new C[A]
你說的是:用A作為參數創建一個C實例。 A符合上述標准嗎? 是的,它是一個接受一個類型參數的類,並且參數化它是自身參數化的子類。
但是,當你寫作
new C[A[Int]]
您嘗試給C,A [Int]的類型參數不符合條件:A [Int]不接受任何類型參數,編譯器會告訴您。 (它也不是A [X]的子類。)
試試這個語法。
class C[M <: A[_]]
這意味着C是一個帶有一個類型參數的類,它應該是A的子類並且需要一個類型參數。
您沒有將X
聲明為C
的類型參數。 請嘗試以下方法:
class C[X, M[X] <: A[X]]
這一切都在這里解釋,關注“常見陷阱”部分,因為它非常TLTR。
你不要讓你的班級拿一個類型的參數,你不要拿兩個! 兩種可能的解決方
class A[X] {
type T = X
}
class C[M <: A[_]] {
//use M#T if you want the type T was parameterized with.
}
或者,您可以這樣做:
class A[X]
class C[T, M[A] <: A[A]] {
//when you want the type, write M[T], not M.
}
但是,你可能想要的是:
class A[X]
class C[M <: A[_]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.