kłopoty z typu "rodzaje":Rodzaje niezgodnych z typem lambda
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] = ???
To nie z
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] = ???
^
czym problem z deklarowanymi granicami? Czy muszę nosić ten typ częściowo pseudokrop * cr do konstruktora typu trait Attr
? I dlaczego? Czy mogę to naprawić bez dotykania definicji Attr
?
zrobić potrzebują granic w funkcji test
w celu wdrożenie do pracy, ale robię nie chcą rozmnażać te granice do publicznego interfejsu Attr
.
Uwaga: Jeśli używam typ członkiem (co nie chcę), to działa:
trait Attr[S <: Sys[S]] { type A[_]}
def test[ S <: Sys[S]]: Attr[S] { type A[S <: Sys[S]] = Expr[S, Int]} = ???
Dzięki za analizę. Ma to sens, chociaż "posiadanie' A [_] '" podczas gdy pozwala na wywołanie "konstruktora typu" 'A [Any]', nie można wywołać konstruktora wartości, więc pod względem czasu działania byłoby dobrze IMO. Z drugiej strony, wyobrażam sobie, że może to powodować problemy z meta-programowaniem kompilacji przy użyciu ograniczeń typu? W końcu rozwiązanie (przynajmniej tak daleko, jak go używam) jest proste. Strona użycia nie może wiele zrobić z 'A [_]' anyways, a informacje tego typu są bardziej dla osoby wywołującej 'test', więc podstawiłem' A1 = A [_] 'w' Attr' i 'test' następnie zwraca' Attr [S, Expr [S, Int]] ". –