2 bazingaea Bazingaea 于 2016.02.20 19:23 提问

<K,V>HashMap<K,V>,后面的(k,v)是泛型,前面的是什么?跪求!

这是源代码:
public static < K,V >HashMap < K,V> newInstance(){
return new HashMap < K, V > ();
}

< K,V >HashMap< K,V>是一个返回类型,那么如题,前面的< K,V>是什么意思?

9个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.20 19:30

没明白你的问题是什么意思,通常使用时这样的HashMap = new HashMap();即创建对象实例时指定key和value的真实类型是什么。
而且你给的这段代码是有编译错误的,如果你这是java代码的话。正确应该是:

    public static HashMap newInstance(){
        return new HashMap();
     }

而且,由于你没有指定K,V,编译器还会给出警告:

 HashMap is a raw type. References to generic type HashMap<K,V> should be parameterized
Bazingaea
Bazingaea 回复毕小宝: 编译器自动把泛型去掉了 == 我重新发了一次 ,麻烦你再看一下
接近 2 年之前 回复
wojiushiwo945you
wojiushiwo945you 回复Bazingaea: 绝对有问题,我用的是jdk8,拷贝后有编译错误的。机器不会骗人的。你自己实践下就知道了。
接近 2 年之前 回复
Bazingaea
Bazingaea 这个代码是应该是正确的,我是从书上copy下来的 ,effetive java
接近 2 年之前 回复
enpterexpress
enpterexpress   2016.02.20 19:29

返回这个类型
函数的返回值类型,这里不是特殊的

luochoudan
luochoudan   Ds   Rxr 2016.02.20 20:05

这都答的啥呀。。类型参数列表,泛型方法独有的,表明类型参数之间、以及参数与返回值之间的关系。泛型基础,建议看一下。

Bazingaea
Bazingaea 就是说这样设置返回类型的格式 是特别的一种么?是不是这样设置以后 在调用这个静态工厂方法创建实例对象时,再设置K和V的具体值?
接近 2 年之前 回复
mengyin521
mengyin521   2016.02.20 23:28

public static HashMap new Instance()
{
return new HashMap();
}

确认 new 和 Instance中间有空格么

确定HashMap是泛型模板么

确定这个函数 需要Static 静态函数么

mengyin521
mengyin521 回复Bazingaea: 应该是 HashMap<String,List<String>> map= new HashMap<String,List<String>>();
接近 2 年之前 回复
Bazingaea
Bazingaea 回复M醉清风Y: 也就是说 <K,V>HashMap<K,V> 这是一种固定的格式 类似于语法一样么?,如果把这个静态方法加到HsahMap类中,就可以直接 Map<String,List<String>> m=HashMap.newInstance(); 这样来创建一个指定泛型的对象么?
接近 2 年之前 回复
mengyin521
mengyin521 回复Bazingaea: 这个HashMap 如果是需要你自己实现的话 创建模板类 CLASS的时候 和一般类 也不一样。如果你调用内置模板 就按这个方法
接近 2 年之前 回复
mengyin521
mengyin521 回复Bazingaea: 泛型构造函数 模板类调用编程格式为 HashMap<K,V> _hMap = new HashMap<K,V>();
接近 2 年之前 回复
Bazingaea
Bazingaea 不好意思,没有空格(我的错 ),泛型编译器没有显示出来 ,我修改了代码 ,麻烦重新看一下
接近 2 年之前 回复
rowanh
rowanh   2016.02.21 00:31

最前面的是定义,你后面要用到几个泛型,在前面的进行定义,算是语法吧。
public static Map list2Map(List list, String keyName,
Class keyClass) {
如这个例子,我需要用到K E,2个泛型,在方法最前面先定义。

rowanh
rowanh   2016.02.21 00:33
 public static <K, E> Map<K, E> list2Map(List<E> list, String keyName,
            Class<K> keyClass) {

哎,编辑器把泛型给去掉了。。再发一次。

rowanh
rowanh 回复Bazingaea: 泛型 就是个语法糖,在编译期检查,字节码的时候都‘擦除’变为object类型,然后自动加转类型的代码。
接近 2 年之前 回复
Bazingaea
Bazingaea Map<String,List<String>> m=HashMap.newInstance(); 这是调用我上面 静态工厂方法的代码
接近 2 年之前 回复
Bazingaea
Bazingaea 你这个方法中有参数,我的没有参数,它是在调用的时候才有K V的值 ,我之前代码也是泛型被去掉了 ,我修改了 ,麻烦你再看一下我源码
接近 2 年之前 回复
fanxiaobin577328725
fanxiaobin577328725   2016.06.22 10:39

这种方式被称作类型推导(type inferernce),具体了解就百度吧。

qq_15672817
qq_15672817   2017.06.02 14:08

这是Effective java中的一段代码。

public static <K,V> HashMap<K,V> newInstance(){
            return new HashMap<K,V>();
}

HashMap前面的代表返回值的类型。具体调用可以像下面这样:

 Map<String,List<String>> m = HashMap.newInstance();

这么写主要是为了避免当泛型很长的时候,代码显得冗余,例如:

 Map<String,List<String>> m = new HashMap<String,List<String>>();
qq_15672817
qq_15672817   2017.06.02 14:56

至于为什么public static <K,V> HashMap<K,V> newInstance(){}这样写 是因为java的语法就是这样,详见该链接: Java语法

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!