泛型,HashMap,爆类型转换错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了泛型,HashMap,爆类型转换错误相关的知识,希望对你有一定的参考价值。

package jihekuangjia;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class test2

/**
* @param args
*/
public static void main(String[] args)
// TODO Auto-generated method stub
Scanner inport=new Scanner(System.in);
STRUDENT student=new STRUDENT();
Map stu=new HashMap();
int a;
do
System.out.println("请输入学生姓名:");
student.name=inport.next();
System.out.println("请输入学生成绩:");
student.result=inport.nextInt();
stu.put(student.name,student.result);
System.out.println("输入1则继续添加学生");
a=inport.nextInt();
while(a==1);
System.out.println("+++++++++++++");
for(Object key:stu.keySet())
STRUDENT studen=(STRUDENT) stu.get(key);//这里爆类型转换错误,请问怎么改
System.out.println(key.toString()+"的成绩是:"+studen.result);




package jihekuangjia;

public class STRUDENT
public String name;
public int result;

STRUDENT studen=(STRUDENT) stu.get(key);//这里爆类型转换错误,请问怎么改

请问怎么修改,为什么会错

参考技术A 您好,HashMap[] aTweightList = new HashMap[10];
aTweightList[1] = new HashMap<String, Float>();
分析:(同样摘自该帖子,解释的还可以,除了编译器不承认HashMap<K,V>[]这种形式是错的外,都没什么问题,事实上,便一起时承认这种写法的,但是基本上你不能使用这么定义的任何一个变量。)
1) 泛型是没有数组的。编译器不承认 HashMap<K,V>[]这种形式的:
Cannot create a generic array of HashMap<k,v>
原因就是数组必须确定他每一个元素的类型。但是泛型在编译阶段有一个类型擦除的问题,也就是说编译器理解 HashMap<Integer,Integer>和HashMap<String,String>都是同一种类型 HashMap。如果泛型数组存在,那么HashMap<Integer,Integer>和 HashMap<String,String>对象都可以加入到同一个HashMap[]数组中,这会造成灾难性的结果。
详细原因可以看这篇博客 http://hxraid.javaeye.com/blog/549509
如果一定要定义HashMap数组,可以使用HashMap[] aTweightList = new HashMap[10]; 形式,也就是HashMap常规类型。
(2) 对于没有初始化的类对象,系统会给予一个null值。但是调用null对象,一定会报NullPointerException异常的。养成随时初始化的好习惯。

利用自定义泛型,自己简单实现HashMap

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。(来自百度百科)


实现步骤

1.首先HashMap表面保存的是Key和Value,但是实际上保存的是一个个的Entry,而Entry里面是Key和Value

public class MyEntry<K, V> 

	private K key;
	private V value;

	public K getKey() 
		return key;
	

	public void setKey(K key) 
		this.key = key;
	

	public V getValue() 
		return value;
	

	public void setValue(V value) 
		this.value = value;
	

2.利用泛型写自己的HashMap,继承HashSet,里有有一个entrys用来保存名-值对的集合。


public class MyHashMap<K, V> extends HashSet 

	private Set<MyEntry<K, V>> entrys = new HashSet<MyEntry<K, V>>();


3.实现HashMap的put(K key, V value)V get(K key)方法

public void put(K key, V value) 
		MyEntry<K, V> myEntry = new MyEntry<K, V>();
		myEntry.setKey(key);
		myEntry.setValue(value);
	
		entrys.add(myEntry);
	

	public V get(K key) 
		V value = null;
		for (Iterator<MyEntry<K, V>> i = entrys.iterator(); i.hasNext();) 
			MyEntry<K, V> entry = i.next();
			if (key.equals(entry.getKey())) 
				value = entry.getValue();
				break;
			
		

		return value;
	
4.实现Set<MyEntry<K, V>> entrySet(),Set<K> keySet(),String toString()三个迭代方法

public Set<MyEntry<K, V>> entrySet() 
		return entrys;
	

	public Set<K> keySet() 
		Set<K> set = new HashSet<K>();
		for (Iterator<MyEntry<K, V>> i = entrys.iterator(); i.hasNext();) 
			MyEntry<K, V> myEntry = i.next();
			set.add(myEntry.getKey());
		
		return set;
	

	@Override
	public String toString() 
		StringBuffer sb = new StringBuffer("[");
		for (Iterator<MyEntry<K, V>> i = entrys.iterator(); i.hasNext();) 
			MyEntry<K, V> myEntry = i.next();
			sb.append(myEntry.getKey());
			sb.append("=");
			sb.append(myEntry.getValue());
			sb.append(",");
		
		sb.deleteCharAt(sb.length() - 1);
		sb.append("]");
		return sb.toString();
	

5.测试。

public class Test 

	/**
	 * @param args
	 */
	public static void main(String[] args) 
		// TODO Auto-generated method stub
		MyHashMap<String, String> map = new MyHashMap<String, String>();

		map.put("hello1", "world1");
		map.put("hello2", "world2");

		System.out.println(map);

		Set<String> set = map.keySet();
		for (String string : set) 
			System.out.println(string);
		

	

有图有真相,总结:HashMap就是自定义索引的Set



以上是关于泛型,HashMap,爆类型转换错误的主要内容,如果未能解决你的问题,请参考以下文章

将泛型类型转换为具体类型时出错

泛型:强制转换和值类型,为啥这是非法的?

泛型类型上的 Linq 类型转换

使用 Kotlin 和泛型进行数据绑定。错误:不兼容的类型:对象无法转换为列表

java泛型

Java 泛型编译错误:不兼容的类型:Item#1 无法转换为 Item#2