Programowałem w języku C#, ale byłem sfrustrowany ograniczeniami jego systemu typów. Jedną z pierwszych rzeczy, dowiedziałem się o Scali było to, że Scala ma wyższe rodzaje genów. Ale nawet gdy przyjrzałem się kilku artykułom, wpisom na blogu i pytaniom, wciąż nie byłem pewien, jakie są wyższe rodzaje genów. W każdym razie napisałem trochę kodu Scala, który kompilował dobrze, Czy ten fragment używa wyższych rodzajów?Scala: Wyższe rodzajowe, otwarte i dzikie karty genowe w Javie, C#, Scala i C++
abstract class Descrip [T <: DTypes, GeomT[_ <: DTypes] <: GeomBase[_]](newGeom: NewGeom[GeomT])
{
type GeomType = GeomT[T]
val geomM: GeomT[T] = newGeom.apply[T]()
}
A potem pomyślałem, że może już używam wyższych rodzajów leków. Tak jak ja to rozumiem, ale teraz, jak to teraz rozumiem, z przyjemnością korzystałem z wyższych typów w języku C#, zanim usłyszałem o Scali. Czy ten snipet używa wyższej jakości typu?
namespace ConsoleApplication3
{
class Class1<T>
{
List<List<T>> listlist;
}
}
Tak, aby uniknąć dalszych nieporozumień myślałem byłoby wyjaśnienie dla każdego Java, C# i Scala co pozwalają one pod względem Higher kinded typy, dzikie karty i korzystania z otwartych/częściowo otwartych typów. Ponieważ kluczową różnicą między C# i Scala wydaje się być to, że Scala zezwala na dzikie karty i typy otwarte, gdzie jako C# nie ma żadnej dzikiej karty i wymaga, aby wszystkie typy ogólne zostały zamknięte przed użyciem. Wiem, że są one różne, ale myślę, że byłoby użyteczne powiązanie istnienia tych funkcji z ich odpowiednikami w C++ Templates.
Tak jest następujące prawidłowe? Tabela ta została skorygowana dla Aleksieja odpowiedź
Lang: Higher-kind Wild-card Open-types
Scala yes yes yes
C# no no no
Java no yes no
C++ yes yes yes
Jakie jest twoje pytanie? –
Czy tabela na dole jest poprawna? Jeśli ktokolwiek może to sformatować lepiej, zrób to? –
To, co napisałeś w języku C#, jest dostępne w języku java, a nie w wersji wyższej. Twoja klasa z powyższym parametrem GeomT jest. Zobacz http://stackoverflow.com/a/10499788/754787. –