我一直在用 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
最佳答案
This is higher kinded type is it not:
没有。更高种类的类型类似于
class Class1<T>
{
T<String> foo; // won't compile in actual C#
}
即一个通用类型,其参数本身必须是通用的。请注意,在此示例中 Class1<IList>
应该编译,但是 Class1<String>
或 Class1<IDictionary>
不应该。
关于c# - Scala:Java、C#、Scala 和 C++ 中的高级类、开放类型和通配符泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10738543/