Java 地图有问题吗?
我有一个关于泛型的问题。有人能解释为什么选项4和6[我知道这个选项]是正确的吗 考虑以下代码: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()
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()如果注释掉第//1行和第//3行,则代码>将起作用
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
literal1
生成的整数
由装箱的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”,列表);是否导致错误“类型映射不适用于参数(字符串、抽象列表)”?