由於具有表示類型的特徵是自引用的,因此聲明變量包含該特徵的實例有點困難。在這個例子中,我簡單地聲明一個變量保存特性的一個實例,聲明功能需要和特點的回報和實例,並調用與變量函數:Scala:使用表示類型
trait Foo[+A <: Foo[A]]
case class Bar() extends Foo[Bar]
case class Grill() extends Foo[Grill]
// Store a generic instance of Foo
val b: Foo[_] = if(true) {
Bar()
} else {
Grill()
}
// Declare a function that take any Foo and returns a Foo of the same type
// that "in" has in the calling context
def echoFoo[A <: Foo[A]](in: A): A = in
// Call said function
val echo = echoFoo(b)
它失敗,出現錯誤:現在
inferred type arguments [this.Foo[_$1]] do not conform to method
echoFoo's type parameter bounds [A <: this.Foo[A]]
val echo = echoFoo(b)
^
,這是有道理的,因爲[_]
就像Any
(的方式我不完全理解)。它可能需要的是類似Foo[Foo[_]]
的東西,以便類型參數符合A <: Foo[A]
的範圍。但是現在有一個內部的Foo
,它具有不一致的類型參數,表明解決方案類似於Foo[Foo[Foo[Foo[...
,這顯然不正確。
所以我的問題可能被提取到:什麼是「這個變量持有任何合法Foo
」Scala語法?
正如我在回答中所說的,這些問題是由於設計不佳造成的。如果你向我們解釋你想做什麼,我們可以討論這個最佳設計 – Edmondo1984 2012-07-24 07:01:45
@ Edmondo1984你不是第一個建議我的基本設計可能是錯誤的人。但是,當然,如果不知道我想用Scala來完成什麼,你不能提出修復建議。我將發佈一個後續問題,這將更接近我的實際問題。 – drhagen 2012-07-24 12:52:46
在這裏發佈引用,所以我們可以嘗試幫助 – Edmondo1984 2012-07-24 13:08:40