c# - Scala:Java、C#、Scala 和 C++ 中的高级类、开放类型和通配符泛型

标签 c# java c++ scala generics

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

相关文章:

java - Avro 和 Kafka 通过使用 SchemaBuilder

java - 尝试将框架附加到面板并绘制多边形,但框架上没有绘图

java - Elasticsearch 中多重匹配查询中的比较运算符

c# - 如何在 C# Azure 函数中将多个参数作为数组传递?

c# - 带有 C# : finding elements with custom predicate 的 MongoDB

c++ - C4533 警告 : why does goto skip variable initialization?

c++ - C/C++ 将定义更改为变量

c++ - GDB 跳过了我的代码!

c# - 替代 .NET 的 Uri 实现?

c# - 如何在 Windows 8 应用商店应用程序中序列化和反序列化 observableCollection?