map泛型 map不指定泛型 与 Map<Object,Object>的区别
{
Map map1 = new HashMap();
Map<String,Object> map2 = new HashMap<String,Object>();
Map<Object,Object> map3 = new HashMap<Object,Object>();
Map<String,String> map4 = new HashMap<String,String>();
test1(map1);
test1(map2);
test1(map3);//编译错误
test1(map4);//编译错误
}
private void test1(Map<String,Object> map)
{
}
String不是可以自动转换为Object吗?为什么map4 做参数报错呢? 展开
有以下区别:
1、表示对象不同
在泛型这里 Object 就只表示Object 不能表示所有对象
2、两种泛型的定义不同
前者是能够确定的泛型,后者是不能够确定的泛型
3、判定方式不同
因为这是两种不同的定义,所以在判定方法上存在不同
泛型的定义主要有以下两种:
1.在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)
2.在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(人们大多把这称作模板)不论使用哪个定义,泛型的参数在真正使用泛型时都必须作出指明。
扩展资料:
.NET Framework 的泛型
泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型及其方法的参数类型出现。泛型方法可以将其类型参数用作其返回值的类型或者其某个形参的类型。
由于.NET Framework 泛型的类型参数之实际类型在运行时均不会被消除,运行速度会因为类型转换的次数减少而加快。
参考资料来源:百度百科-泛型
有以下区别:
1、表示对象不同
在泛型中,对象仅表示对象不能代表所有对象。
2、两种泛型的定义不同
前者是可以确定的通用类型,后者是无法确定的通用类型。
3、判定方式不同
因为这是两个不同的定义,所以判断方法有所不同。
泛型有两个主要定义:
(1)有些类型在程序编码中包含类型参数,即通用参数只能表示类,而不能表示单个对象。
(2)某些类在程序代码中包含参数,它的参数可以表示类或对象,等等。无论使用哪种定义,都必须在实际使用泛型时指定其参数。
扩展资料:
.NET Framework 的泛型:
泛型是带有占位符(类型参数)的类,结构,接口和方法。 这些占位符是由类,结构,接口和方法存储或使用的一种或多种类型的占位符。 通用集合类可以将类型参数用作其存储的对象类型的占位符; 类型参数显示为其字段的类型和方法的参数类型。
泛型方法可以将其类型参数用作其返回值的类型或者其某个形参的类型。
由于.NET Framework泛型的类型参数的实际类型不会在运行时消除,因此,由于减少了类型转换的次数,因此将加快运行速度。
参考资料来源:
你得记住这句话:子类实例可以赋给任何父类对象。
如果理解了这句话,那就容易了,首先你看:
Map map1 = new HashMap();//这行代码实际上是说map1里面的key和value都认为是任意类型,也就是你可以理解为强制类型转换为方法test1的参数类型,没有问题;
再看:
Map<String,Object> map2 = new HashMap<String,Object>();
这里代码标明了map2的key是String,value是Object,正好和test1方法的参数类型匹配,没有问题;
继续看:
Map<Object,Object> map3 = new HashMap<Object,Object>();
map3标明了里面的key和value都是Object类型,由于Object可以代表任何的数据类型对象(当然String也行),如果它里面保存的Integer的key呢?那么就不能作为方法test1的传入参数了,因此虚拟机考虑到这点,就出现变异错误了;
最后看:
Map<String,String> map4 = new HashMap<String,String>();
这里标识了map4里面key和value都只能保存String的值,而方法
test1处理的是String类型的key,Object类型的值,传入的不匹配,于是错误就出现了。
最后,总结给你的就是,如果使用泛型作为方法参数,如果传入泛型实例,一定要求完全匹配,否则传入非泛型的数据类型。
因为泛型是保证编译时你给的实际类型和参数声明的类型一致,它的意义就在于此,不需要解释,这是需要你学习的规则而已。
那为什么map1就可以呢,这里有历史原因,因为泛型是后加入的,早期的版本没有,但是java的开发者希望不能因为加入泛型就要修改成千上万的现有应用,所以默认他可以通融老版本不加泛型的变量,但是编译时一定会有提示你有危险代码的,正因为这样,泛型非常的好破,随便写点代码就可以让编译通过,而运行时错误,所以现在开发,一定要使用一种代码,千万不要两者都用,那样太危险,如果你用了泛型,就全部都用,切记切记
Map<String,Object> 与 Map<Object,Object> 标识的是map的类型,map并不能强转啊。