Próbuję uzyskać lepsze zrozumienie z następujących zachowań:typu Scala granice i wariancji
scala> class C[-A, +B <: A]
<console>:7: error: contravariant type A occurs in covariant position
in type >: Nothing <: A of type B
class C[-A, +B <: A]
^
Jednak następujące prace:
scala> class C[-A, +B <% A]
defined class C
widzę, że nie może być zagadnienia z wariancja zmiennych ograniczających i ograniczonych jest przeciwna, chociaż nie jestem pewien, jaki jest konkretny problem. Jeszcze mniej wiadomo, dlaczego zmiana typu związanego z widokiem powoduje, że wszystko jest w porządku. W przypadku braku odpowiednich niejawnych konwersji spodziewałbym się, że te dwie definicje będą miały w dużym stopniu ten sam skutek. Jeśli cokolwiek, spodziewałbym się, że widok zapewni więcej okazji do psot.
Dla nieco tło I definiowania klas, które są w pewnym sensie jak funkcje, a ja chciałem zrobić coś takiego
CompositeFunc[-A, +B <: C, -C, +D] (f1 : BaseFunc[A, B], f2 : BaseFunc[C, D])
extends BaseFunc[A, D]
zapewne
CompositeFunc[-A, +B <% C, -C, +D] (f1 : BaseFunc[A, B], f2 : BaseFunc[C, D])
extends BaseFunc[A, D]
jest rzeczywiście lepsze, ale nadal chciałbym lepiej zrozumieć, co się tutaj dzieje.
Intrygujące ... Spędziłem 1 godzinę patrząc na przykład w przypadku typu przerwy bezpieczeństwa ze związanym typem. Nie znaleziono :( – gzm0
Również jeśli był przykład, który był niesłuszny z powiązanym typem, trudno jest zobaczyć, jak zastąpiłby go widok w powiązaniu widoku. –
Zgadzam się, ale podstawową różnicą jest to, że widok jest ograniczony. zawsze konwertuje zgodnie z typami, z którymi klasa została utworzona, ale niekoniecznie jest to związane z typem. (mówi przynajmniej moja intuicja ...) – gzm0