2008-09-08 14 views
7

Spodobała mi się dyskusja pod numerem Differences in Generics i zastanawiałem się, czy były jakieś języki, które korzystały z tej funkcji.Czy są jakieś języki, które implementują generics _well_?

Naprawdę nie lubię Javy List<? extends Foo> dla List rzeczy, które są substytutem Liskov dla Foo. Dlaczego nie można tego objąć w List<Foo>?

I szczerze, Comparable<? super Bar>?

Ja też nie pamiętam za życie mojego dlaczego nigdy nie należy zwracać tablicę leków generycznych:

public T[] getAll<T>() { ... } 

Nigdy nie lubiłem szablony w C++, ale to głównie dlatego, że żaden z kompilatorów mógł kiedykolwiek wypluć dla nich zdalnie znaczący komunikat o błędzie. Pewnego razu zrobiłem 17-krotnie make realclean && make, aby uzyskać coś do skompilowania; Nigdy nie rozgryzłem, dlaczego ten 17 raz był urokiem.

Więc, kto tak naprawdę lubi używając generycznych w ich domowych językach?

+0

Powinien być wspólnotowym wiki. –

+0

Brzmi dobrze dla mnie :) –

Odpowiedz

14

Haskell dość dobrze implementuje parametryzację typu konstruktora (generyczne lub parametryczne polimorfizmy). Podobnie jak Scala (choć czasami potrzebuje trochę trzymania ręki).

Oba te języki mają wyższe typy typów (konstruktory abstrakcyjnego typu a.k.a, polimorfizm typu konstruktora typu lub polimorfizm wyższego rzędu).

Zobacz tutaj: Generics of a Higher Kind

7

Heck, angielski nie jest jeszcze zaimplementować rodzajowych dobrze. :)

Moje nastawienie dotyczy C#. Głównie dlatego, że właśnie tego obecnie używam i wykorzystałem je z dobrym skutkiem.

1

Używam .Net (VB.Net) i nie miałem żadnych problemów z używaniem generycznych. To w większości bezbolesne.

Dim Cars as List(Of Car) 
Dim Car as Car 

For Each Car in Cars 
... 
Next 

Nigdy nie miałem żadnych problemów przy użyciu rodzajowe kolekcje, chociaż ja nie poszły tak daleko, aby zaprojektować żadnych przedmiotów, które używają rodzajowych na własną rękę.

7

Myślę, że generics w Javie są całkiem dobre. Powodem, dla którego List<Foo> jest inny niż List<? extends Foo>, jest to, że gdy Foo jest podtypem Bar, List<Foo> nie jest podtypem List<Bar>. Jeśli możesz potraktować obiekt List<Foo> jako obiekt List<Bar>, możesz dodać do niego obiekty Bar, które mogą uszkodzić obiekty. Każdy rozsądny system będzie tego wymagał. Java pozwala uciec z leczenia Foo[] jako podtypu Bar[], ale to wymusza kontrole w czasie wykonywania, zmniejszając wydajność. Gdy zwrócisz taką tablicę, kompilator będzie miał trudności z ustaleniem, czy wykonać test środowiska wykonawczego.

Nigdy nie musiałem używać dolnych granic (List<? super Foo>), ale wyobrażam sobie, że mogą one być przydatne do zwracania ogólnych wartości. Zobacz covariance and contravariance.

Zdecydowanie zgadzam się ze skargami dotyczącymi nadmiernie złożonej składni i mylących komunikatów o błędach.Języki z wnioskami typu OCaml i Haskell prawdopodobnie ułatwią ci to, chociaż ich komunikaty o błędach również mogą być mylące.

+0

W większości zgadzam się z tobą, ale mam dwie rzeczy do punktu: typ wymazania może być czasem bólem i nie można używać typów pierwotnych z rodzajami. –

3

Dodam OCaml do listy, która ma naprawdę generycznych generatorów. Zgadzam się, że klasy typu Haskella są naprawdę dobrze zrobione, ale jest trochę inaczej, ponieważ Haskell nie ma semantyki OO, ale OCaml obsługuje OO.

0

Myślę, że C# i VB.NET wykonują dobrą pracę z lekami generycznymi.

Powiązane problemy