我一直在使用 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