Java 1.7与C#List/Set/Map语法糖

本文关键字:Set Map 语法 C#List Java | 更新日期: 2023-09-27 18:00:40

以下内容应该是Java 1.7的一部分:

List<String> list = ["item"];
String item = list[0];
Set<String> set = {"item"};
Map<String, Integer> map = {"key" : 1};
int value = map["key"];

这在C#(和VB.NET)中几乎可以做到,但语法略有不同。在.NET中,这是作为索引属性实现的,这是任何开发人员都可以用来应用于自己的类的语言功能。

有人知道这些特性是否是列表、集合、映射和子类的严格硬编码,或者这背后有一个更通用的语言特性吗?

Java 1.7与C#List/Set/Map语法糖

这两个功能都没有进入JDK7。此处列出了进行切割的Java语言更改:

JSR334:小型语言增强(Project Coin)。一组小的语言更改,旨在简化常见的日常编程任务:switch语句中的字符串、try-with-resources语句、用于创建泛型实例的改进的类型推理("菱形")、简化的varargs方法调用、更好的整数文本和改进的异常处理(多捕获)

剩下的";Project Coin"特性和其他语言更改被推到了JDK8:

JSR294:对模块化编程的语言和虚拟机支持。增强Java语言和虚拟机规范,以在编译时和运行时支持模块化编程

JSR308:Java类型的注释。Java注释语法的扩展,允许对任何类型的出现进行注释

JSR待定:对集合的语言支持。不可变列表、集合、的文字表达式

JSR待定:Lambda项目。Java编程语言的Lambda表达式(非正式地称为"闭包")和defender方法

您指的是Project Coin的两个不同功能,它们被NOT接受包含在JDK 7中。

  1. 支持集合文字

    SomeClass a;
    SomeClass b;
    List<SomeClass> list = [a, b];
    Map<String, SomeClass> map = { "key1": a, "key2": b };
    Set<SomeClass> set = { a, b };
    

    需要注意的是,这些文字只允许创建不可修改的(在.NET中为只读)集合。据我所知,C#中不存在这样的文字(除了数组,但这样的文字在Java中也存在了很长时间)。它也与索引属性无关。

  2. 列表和地图的索引访问语法

    List<SomeClass> l = new ArrayList<>();
    SomeClass first = new SomeClass();
    l[0] = first; // instead of l.set(0, first);
    SomeClass retrieved = l[0] // instead of l.get(0);
    // Similar thing for maps.
    

    这是C#中作为索引属性实现的特性,它只适用于ListMap接口(请记住,与.NET类库相反,Java接口通常不以I为前缀)——它只不过是编译器对这些方法的调用的转换。

在这两种情况下,都没有通用的语言特征,只有一点语法糖:

  • 对于第一个特性,编译器将把文本转换为对几个方法的调用,以创建不可修改的ListSetMap。(我似乎记得,返回的具体类甚至不公开。)
  • 对于第二个特性,只要类实现ListMap接口,编译器就会将表达式转换为对相关方法的调用

他们想在Java中添加一些其他语言(静态/动态)已经具备的功能。映射的初始化方式与一些动态语言相同。