javaSE中有关泛型的一些问题,求帮助

xuansukewei 2018-04-01 05:55:09
package com.ex_collection;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class TestGenerics <K, V> {
private Map<K, V> hmap = new HashMap<K, V>();

//错误
public <V> V addEle(K key, V value) { //不能加<V>,但可以换成其他的,如<V1>等
V returnV = null;
if(hmap.containsKey(key)) {
returnV = hmap.get(key);
}
hmap.put(key, value);
return returnV;
}

public <T> T testGen(boolean b, T first, T second) {
return b ? first : second;
}

public static void main(String args[]) {
TestGenerics<Integer, String> ts = new TestGenerics<Integer, String>();
ts.addEle(0, "0");
ts.addEle(1, "1");
ts.addEle(2, "2");
ts.addEle(3, "3");
ts.addEle(4, "4");
ts.addEle(5, "5");
String returnV = ts.addEle(0, "6");
System.out.println(returnV);
}
}

方法前加泛型到底什么含义呢?为什么第一个方法前不能加<V>而可以换成其他的,如果换成其他的,其代码表示的实际含义是什么?
...全文
467 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjsl__ 2018-04-03
  • 打赏
  • 举报
回复
泛型方法,在使用时再决定传入什么参数
public <T> T testGen(boolean b, T first, T second)

使用方法 xxx.testGen(true,String first,String second)
这个时候返回String
注意编译器提示 <String> String question.MainClass.testGen(boolean b, String first, String second)


public <V> V addEle(K key, V value)
其实泛型方法形参里面一般都是要包含这个泛型的,但是前面已经声明过V了,这里的入参就是声明时的V,
调用时只能选择声明时的V,而不能灵活改变
那这就不是一个泛型方法,不需要声明为一个泛型方法,应去掉<V>,其实这里不能用V来声明

public <V1> V addEle(K key, V value)这样子声明表示这个方法是一个泛型方法,需要根据调用时的情况决定V1是什么,但是入参没有V1,那编译能通过,实际毫无意义

泛型方法前一定要声明<某泛型标识> 否则会出现如下情况
public FanXing addEle(FanXing key, FanXing value),编译器会把FanXing 当作一个类去解释,而不是一个泛型标识

public <FanXing > FanXing addEle(FanXing key, FanXing value)
就像实例化map是指明<>内的内容一样,使用泛型方法时指明<>的内容,


maradona1984 2018-04-02
  • 打赏
  • 举报
回复
泛型类似于变量,类型变量,在一个作用域下,同一个变量自然只能定义一次
自由自在_Yu 2018-04-02
  • 打赏
  • 举报
回复
public <V1> V addEle(K key, V value) { // 不能加<V>,但可以换成其他的,如<V1>等,
		//这里可以用V1,是声明了V1,V1与上面的V不冲突,虽然声明了V1,但是没有用到这个类型的,返回值仍然是V的对象
		V returnV = null;
		if (hmap.containsKey(key)) {
			returnV = (V) hmap.get(key);
		}
		hmap.put(key, value);
		return returnV;
	}

	public <V1> V1 addEle2(K key, V value) { //返回值为V1的对象,V1可以是其他字母,不与K,V冲突就行
		V1 returnV = null;
		if (hmap.containsKey(key)) {
			returnV = (V1) hmap.get(key);//V强制转换成V1类型,可能转换异常
		}
		hmap.put(key, value);
		return returnV;
	}
自由自在_Yu 2018-04-02
  • 打赏
  • 举报
回复
TestGenerics <K, V> 这里已经声明了V,不能重新声明一个V了, 就像下面的<T> T ,类里面没有声明T,所以在这里声明一下
maikangzhi 2018-04-01
  • 打赏
  • 举报
回复
public <V> V addEle(K key, V value) { //不能加<V>,但可以换成其他的,如<V1>等 V returnV = null; if(hmap.containsKey(key)) { returnV = hmap.get(key); } hmap.put(key, value); return returnV; } 你好,我检查了一下,错误在public<V >,去掉<V>就可运行了! 望采纳

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧