簡體   English   中英

Scala的類型系統中的錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM