当前位置: 首页 > 面试题库 >

用Diamond运算符进行双花括号初始化(匿名内部类)

东方俊力
2023-03-14
问题内容

我想知道为什么第二个地图声明(使用菱形运算符)在第一个地图声明时不编译。编译错误:

错误:无法推断HashMap的类型参数;Map map2 = new HashMap
<>(){原因:不能对K,V是类型变量的匿名内部类使用’<>’:K扩展在HashMap类中声明的对象V扩展在HashMap类中声明的对象

码:

    Map<String, String> map1 = new HashMap<String, String>() { //compiles fine

        {
            put("abc", "abc");
        }
    };

    Map<String, String> map2 = new HashMap<>() { //does not compile

        {
            put("abc", "abc");
        }
    };

编辑
感谢您的回答-
我应该更好地阅读编译错误。我在JLS中找到了

如果类实例创建表达式使用“ <>”形式为类的类型参数声明了一个匿名类,则会产生编译时错误。


问题答案:

您这里没有 静态 初始值设定项(关键字 static 完全缺失)。

基本上,您将创建一个新的匿名子类,HashMap并在此处定义实例初始化器块。顺便说一句,这只是有效,因为HashMap它不是最终的。

由于您将获得HashMap菱形运算符的匿名子类在这里不起作用,因为该子类随后将像您编写的那样进行编译,... extends HashMap<Object, Object>并且显然与不兼容Map<String, String>



 类似资料:
  • 问题内容: 在Java的“ 隐藏功能”中,最常见的答案是,其语法非常诱人: 此成语创建一个匿名内部类,其中仅包含一个实例初始化程序,该实例“可以使用包含范围内的任何方法”。 主要问题:这听起来像效率低下吗?它的使用是否应仅限于一次性初始化?(当然还有炫耀!) 第二个问题:新的HashSet必须是实例初始化程序中使用的“ this”……任何人都可以阐明该机制吗? 第三个问题:这个习惯用法是否太晦涩,

  • 问题内容: 有什么方法可以初始化Java中的匿名内部类吗? 例如: 有没有办法在类声明中的某处使用例如putValue方法? 问题答案: 使用初始化程序块: 初始化实例成员 通常,您需要将代码放在构造函数中以初始化实例变量。使用构造函数初始化实例变量有两种选择:初始化块和final方法。实例变量的初始化块看起来像静态初始化块,但没有static关键字: Java编译器将初始化程序块复制到每个构造函

  • Java中的双大括号初始化语法()是什么?

  • 问题内容: 在php中声明属性时,为什么无法将属性初始化为函数?以下代码片段导致 解析错误:语法错误,意外的T_FUNCTION 您还可以将属性初始化为字符串,数字或其他数据类型吗? 编辑: 但是我可以在__construct()方法中将函数分配给属性。以下工作正常: 问题答案: 因为它不是用PHP实现的。 http://www.php.net/manual/zh/language.oop5.pr

  • 本文向大家介绍WordPress add_action-初始化-匿名函数,包括了WordPress add_action-初始化-匿名函数的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 考虑下面的Java代码,它尝试实例化一些: 并且很简单;在Java 7中使用新的Diamond运算符来减少不必要的类型参数重复。 是使用匿名类的一种变体,可能会覆盖的某些方法。 尝试使用菱形运算符,类似于,但这是编译错误,消息 “ <>”不能与匿名类一起使用。 产生一个错误,证明编译器知道实际需要的类型。错误消息是 类型不匹配:无法从新的ArrayList (){}转换为List 因此