符合遇到問題,類型爲「種」:種不與類型拉姆達
trait Sys[ S <: Sys[S]]
trait Expr[S <: Sys[S], A]
trait Attr[S <: Sys[S], A[_]]
def test[ S <: Sys[S]]: Attr[S, ({type l[x<:Sys[x]]=Expr[x,Int]})#l] = ???
這種失敗
error: kinds of the type arguments (S,[x <: Sys[x]]Expr[x,Int]) do not conform
to the expected kinds of the type parameters (type S,type A) in trait Attr.
[x <: Sys[x]]Expr[x,Int]'s type parameters do not match type A's expected parameters:
type x's bounds <: Sys[x] are stricter than type _'s declared bounds >: Nothing <: Any
def test[S <: Sys[S]]: Attr[S, ({type l[x<:Sys[x]]=Expr[x,Int]})#l] = ???
^
什麼是與申報範圍的問題嗎?我是否需要將這個cr * ppy部分應用類型攜帶到trait Attr
的類型構造函數中?爲什麼?我可以修復此問題而不觸及Attr
的定義嗎?
我需要爲了在功能test
邊界的實施工作,但我不希望增殖這些邊界的公共接口Attr
。
注意:如果我使用一個類型成員(我不想要的東西),它的工作原理:
trait Attr[S <: Sys[S]] { type A[_]}
def test[ S <: Sys[S]]: Attr[S] { type A[S <: Sys[S]] = Expr[S, Int]} = ???
感謝您的分析。它是有道理的,雖然「有一個'A [_]'」,而它允許你調用「類型構造函數」A [Any]',你不能調用一個值構造函數,所以就運行時而言這可能沒問題IMO。另一方面,我想這可能會導致使用類型約束的編譯時元編程的問題?最後,解決方案(至少我一直在使用它)很簡單。無論如何,使用站點不能用'A [_]'做很多事情,這種類型的信息更多地用於'test'的調用者,所以我用'Attr'替代'A1 = A [_]',然後'test'返回' Attr [S,Expr [S,Int]]'。 –