Я программировал на С#, но был разочарован ограничениями его системы типов. Одна из первых вещей, которые я узнал о Scala, заключалась в том, что Scala имеет более высокие сородичи. Но даже после того, как я просмотрел ряд статей, записей в блогах и вопросов, я до сих пор не был уверен, что такое более высокие сородичи. В любом случае, я написал код Scala, который скомпилирован отлично, Использует ли этот фрагмент более высокие типы?
abstract class Descrip [T <: DTypes, GeomT[_ <: DTypes] <: GeomBase[_]](newGeom: NewGeom[GeomT])
{
type GeomType = GeomT[T]
val geomM: GeomT[T] = newGeom.apply[T]()
}
И тогда я подумал, что, возможно, я уже использую более высокие сородичи. Насколько я понимаю, я был, но тогда, как я теперь понимаю, я уже с удовольствием использовал более высокие типы типов на С#, прежде чем я даже слышал о Scala. Использует ли этот снайпер более высокий тип?
namespace ConsoleApplication3
{
class Class1<T>
{
List<List<T>> listlist;
}
}
Итак, чтобы предотвратить дальнейшую путаницу, я подумал, что было бы полезно уточнить для каждого из Java, С# и Scala то, что они позволяют в терминах более высоких типов, диких карт и использования открытых/частично открытых типов. Поскольку ключевое различие между С# и Scala, похоже, заключается в том, что Scala позволяет использовать дикие карты и открытые типы, где С# не имеет wild card и требует, чтобы все общие типы были закрыты перед использованием. Я знаю, что они разные, но я думаю, было бы полезно связать существование этих функций с их эквивалентом в С++ Templates.
Итак, правильнее?. Эта таблица была исправлена для ответа Алексея
Lang: Higher-kind Wild-card Open-types
Scala yes yes yes
C# no no no
Java no yes no
C++ yes yes yes