为什么我们需要Java 7中的菱形运算符?

bal*_*ent 0 java java-7

我很好奇为什么我们需要Java7中的钻石操作符?我们可以使用一个简单的静态泛型方法来模拟这种行为,该方法可以添加到集合API中:

HashMap的方法代码:

public static <R, S> HashMap<R, S> getInstance() {
    return new HashMap<R, S>();
}
Run Code Online (Sandbox Code Playgroud)

我们可以这样使用它:

Map<String, List<String>> m = HashMap.getInstance();
Run Code Online (Sandbox Code Playgroud)

和代码,当你可以尝试这种行为:

import java.util.HashMap;
import java.util.Map;
import java.util.List;
import java.util.Arrays;

public class Diamond {
    public static void main(String... args) {
        Map<String, List<String>> m = getInstance();
        m.put("Hello", Arrays.asList("Peter", "Robert"));
        System.out.println(m.toString());
    }
    public static <R, S> HashMap<R, S> getInstance() {
        return new HashMap<R, S>();
    }
}
Run Code Online (Sandbox Code Playgroud)

mer*_*ike 5

虽然你是正确的,可以使用通用工厂方法来避免在创建通用对象时重复类型参数,但这种方法有一些缺点:

  • 您需要为每个泛型类的每个构造函数编写一个工厂方法,复制其参数列表和参数文档.
  • 使用构造函数,很明显正在创建一个新对象.通过方法,必须非正式地传达这种知识.
  • 呼叫者需要知道在哪里找到工厂方法.特别是,如果它不是被实例化的泛型类的一部分,不同的人可能会将它们放在不同的实用程序类中,进一步增加代码重复...