私はC#でプログラミングしてきましたが、その型システムの制限に不満を感じていました。私が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のことを聞く前に、C#でより高い種類の型をすでに喜んで使用していました。このスニペットはより高い種類のタイプを使用していますか?
namespace ConsoleApplication3
{
class Class1<T>
{
List<List<T>> listlist;
}
}
したがって、さらなる混乱を避けるために、Java、C#、Scalaのそれぞれについて、より高い種類の型、ワイルドカード、およびオープン/部分的にオープンな型の使用に関して、それらが何を許可するかを明確にすることが役立つと思いました。C#とScalaの主な違いは、Scalaではワイルドカードとオープンタイプが許可されているようですが、C#にはワイルドカードがなく、使用する前にすべての汎用タイプを閉じる必要があります。それらは多少異なることは知っていますが、これらの機能の存在をC++テンプレートの同等の機能に関連付けると便利だと思います。
それで、次は正しいですか?この表は、Alexeyの回答に合わせて修正されています
Lang: Higher-kind Wild-card Open-types
Scala yes yes yes
C# no no no
Java no yes no
C++ yes yes yes