Java 地图有问题吗?

Java 地图有问题吗?,java,arraylist,Java,Arraylist,我有一个关于泛型的问题。有人能解释为什么选项4和6[我知道这个选项]是正确的吗 考虑以下代码: import java.util.*; public class TestClass { public static void main(String[] args) { // put declaration here m.put("1", new ArrayList()); //1 m.put(1, new Object()

我有一个关于泛型的问题。有人能解释为什么选项4和6[我知道这个选项]是正确的吗

考虑以下代码:

import java.util.*;  
public class TestClass 
{  
    public static void main(String[] args)   
    {  
    // put declaration here      
    m.put("1", new ArrayList()); //1  
    m.put(1, new Object()); //2  
    m.put(1.0, "Hello");  //3  
    System.out.println(m);  
    }  
}  
如何声明'm'以使上述代码编译和运行时不会出错

  • Map m=newtreemap()
  • Map m=newtreemap()
  • Map Map=newlinkedhashmap()
  • Map m=newlinkedhashmap()将起作用
    如果注释掉了第//2行和第//3行
    
  • Map m=newlinkedhashmap()将起作用
  • Map m=newhashmap()

  • 数字4对于第1行是正确的,因为“1”是具有对象超类和
    的字符串?超级ArrayList
    意味着您可以使用ArrayList或ArrayList的任何超类

    数字6是正确的,因为您使用的是非类型化(原始)映射,所以它类似于:

    Map<Object, Object> m = new HashMap<Object, Object>();
    
    Map m=newhashmap();
    

    要存储这样的值,您可以使用Map,但它不是一个很好的选择。您根本不应该使用非类型化集合。思考如何更改设计以不使用此类映射。

    要了解此问题,请查看您在此处使用的方法的通用签名。它说:

    V put(K key, V value)
    
    什么意思是您可以放置一个可分配给
    Map
    的键类型
    K
    的泛型类型的键和一个可分配给
    Map
    的值类型
    V
    的泛型类型的值。对于放入映射中的所有键值对,这必须为真。从代码中,您将以下键放入地图中:

  • 通过文本
    “1”
  • 由装箱的
    int
    literal
    1
    生成的
    整数
  • 由装箱的
    Double
    文本
    1.0
    生成的
    Double
  • 这些对象唯一常见的超级类型是
    Object
    类型,它是
    K
    所需的,以便允许将所有这些对象用作键

    对于您拥有的值:

  • 一个
    ArrayList
    实例
  • 对象
    实例
  • 一个
    字符串
    “Hello”
  • 同样,这些对象的唯一常见超级类型是
    对象
    类型,它是
    V
    所需的,以便允许将所有这些对象用作贴图值

    因此,仅允许使用通用签名
    Map
    Map
    实例。您选择的
    Map
    接口的实现取决于您,只要它是映射的变量类型,即您可以使用
    LinkedHashMap
    TreeMap
    HashMap
    ,因为它们只在存储数据的方式上有所不同。对于变量的一般类型,请注意通配符的使用
    ?为变量扩展…
    将导致无法再将值放入映射。我链接的教程解释了原因

    对于您正在使用的具有非泛型签名的类型,它们的行为类似于具有泛型签名的
    Map
    s。然而,这些原始类型应该是


    有了这些信息,您可以自己回答(考试)问题。

    选项1。二,。都是一样的。你能更新它们吗?你试过自己编码和编译吗?选项1和选项2的区别是什么?选项2是2.Map m=new TreeMap();那么,你能修改这篇文章吗?任何涉及尖括号的内容都需要用反勾引述,否则浏览器会将其视为未知的HTML/XML标记。谢谢你的回复。“…或ArrayList的任何超类。”我肯定你指的是这里的任何子类。@user3301492请阅读关于下界通配符@user3301492的内容。正如super关键字所示,它确实是超类。顺便说一句:虽然原始类型与使用
    参数化的类型“相似”,但它们之间存在细微的差异。简单地说:在后一种情况下,检查类型的一致性,而对于原始类型,根本不进行检查。那么,为什么使用超类AbstractList=newArrayList();m、 放入(“1”,列表);是否导致错误“类型映射不适用于参数(字符串、抽象列表)”?