Geben Sie die Invarianz in generischer Klasse ein, wenn Callable beteiligt ist

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Geben Sie die Invarianz in generischer Klasse ein, wenn Callable beteiligt ist

by Anonymous » Today, 09:57

Warum ist im folgenden Beispiel die Typ Variable t in der Klasse E invariante?

Code: Select all

class C:
pass

class D(C):
pass

class E[T: C = C]:
def g(self, f: Callable[[], T]) -> T:
return f()

x: E = E[D]()  # error
< /code>
Rückgabetypen sind kovariante. Typecks: < /p>
x = E()  # x is E[C]
x.g(D)   # f is Callable[[], D] which fits on Callable[[], C]
Entfernen oder anderweitig ändern Sie den Anruf, um T zu haben, da ein Rückgabetyp T Kovariante erneut macht:

Code: Select all

class E[T: C = C]:
def g(self, f: Callable[[], None]) -> T:
return cast(T, f())  # anything

x: E = E[D]()   # OK
In Anbetracht des ersten Beispiels ist die Begründung für E [D] nicht mit e [c] ?

Top